2011-08-08 57 views
2

这是我的情况,我通过API从我的Shopify商店获取数据并将它们保存到数据库。我的问题是如何防止重复记录感染数据库。有关此的任何代码片段?谢谢!我只需要保存从商店制作的新条目而不是一次又一次地将所有条目输入数据库。检查轨道数据库中的重复记录

+0

请提供一些代码 – Ant

回答

2

您可以在模型中添加validates_uniqueness_of :field,或者在数据库中使用UNIQUE约束,或者两者都使用UNIQUE约束。

重复的条目将引发异常,您可以捕获并忽略该异常。

+0

因此,如果这是我店里的数据来到我的数据库:1,2,3,4,5和我加上了值6,(数据现在是1,2,3,4, 5,6)只有6将被保存在我的数据库?是吗?我有这个错误:ActiveRecord :: RecordNotUnique –

+0

每一块数据一个接一个。如果违反约束,则应抛出异常。只要忽略异常并转到下一条记录即可。 –

+0

是的,我认为它违反了我在数据库中所做的约束,这就是为什么我有这个错误。那么,我如何才能做出这个例外并转移到下一个记录呢?这个错误让我无法继续前进。对不起,我是一个铁轨新手。 –

0

另一种方法是只抓取Shopify中新记录。例如,如果您同步的产品,您从Shopify商店拉下最后的产品ID为12345,那么你可以只打了API的所有具有比12345更大的ID产品:

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)更新您的应用程序数据库时,使用的是来自Shopify作为product_idid您的本地Product模型的属性。这将确保每次您同步您的订单时,您正在更新已经同步的订单,并添加那些尚未同步的订单。

当然,请确保您的索引表productsproduct_id列通过将以下内容迁移:

add_index :products, :product_id, unique: true 

该指数将确保您不能创建重复product_id值的产品记录。如果需要,对于一些奇怪的边缘情况,您可以随时解救出ActiveRecord::RecordNotUnique错误并处理它们。