这是我的情况,我通过 API 从我的 Shopify 商店获取数据并将它们保存到数据库中。我的问题是如何防止重复记录感染数据库。关于这个的任何代码片段?谢谢!我只想保存从商店创建的新条目,而不是让所有条目一遍又一遍地进入数据库。
2 回答
您可以validates_uniqueness_of :field
在模型中添加 a,或在数据库中使用 UNIQUE 约束,或两者兼而有之。
重复的条目将引发异常,您可以捕获并忽略该异常。
另一种方法是仅从 Shopify 中获取新记录。例如,如果您正在同步产品,并且您从 Shopify 商店中下载的最后一个产品 ID 是12345
,那么您可以为所有 ID 大于 的产品点击 API 12345
:
products = ShopifyAPI::Product.all(params: {since_id: 12345})
或者,您可以记录上次在某处同步产品的时间,例如products_last_synced_at
字段。您可以点击 Shopify API 以获取自上次同步以来已更新的记录:
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
错误并处理它们。