Проверка дубликатов записей в базе данных в рельсах - PullRequest
2 голосов
/ 08 августа 2011

Это моя ситуация, я получаю данные из своего магазина Shopify через API и сохраняю их в базу данных.Моя проблема заключается в том, как предотвратить дублирование записей в базе данных.какой-нибудь фрагмент кода по этому поводу?Спасибо!я хочу, чтобы только новые записи, сделанные из магазина, сохранялись вместо того, чтобы все записи снова и снова попадали в базу данных.

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Вы можете либо добавить validates_uniqueness_of :field в вашу модель, либо использовать ограничение UNIQUE в вашей базе данных, либо и то и другое.

Дублирующие записи вызовут исключение, которое вы можете перехватить и проигнорировать.

0 голосов
/ 12 июня 2012

Другой метод - захватывать только новые из Shopify записи. Например, если вы синхронизируете продукты, а последний идентификатор продукта, который вы извлекли из магазина Shopify, равен 12345, то вы можете просто нажать API для всех продуктов с идентификатором, превышающим 12345:

products = ShopifyAPI::Product.all(params: {since_id: 12345})

Или вы можете записать, когда вы в последний раз синхронизировали свои продукты, например, в поле products_last_synced_at. Вы можете нажать API Shopify для записей, которые были обновлены с момента последней синхронизации:

products = ShopifyAPI::Product.all(params: {updated_at_min: shop.products_last_synced_at})

Наконец, я бы использовал что-то вроде Product.find_or_create_by_product_id(12345) при обновлении базы данных ваших приложений и использовании id, который приходит из Shopify, в качестве атрибута product_id вашей локальной Product модели. Это будет гарантировать, что каждый раз, когда вы синхронизируете свои заказы, вы обновляете уже синхронизированные и добавляете те, которые не синхронизировали.

Конечно, не забудьте проиндексировать столбец product_id вашей таблицы products, добавив в вашу миграцию следующее:

add_index :products, :product_id, unique: true

Этот индекс гарантирует, что вы не сможете создавать записи продукта с дублирующимися значениями product_id. При необходимости в некоторых странных случаях вы всегда можете спасти от ошибок ActiveRecord::RecordNotUnique и обработать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...