2

これが私の状況です。Shopify ショップから API 経由でデータを取得し、データベースに保存しています。私の問題は、重複レコードがデータベースに侵入するのを防ぐ方法です。これに関するコードスニペットはありますか? ありがとうございました!すべてのエントリがデータベースに何度も入力されるのではなく、ショップから作成された新しいエントリのみが保存されるようにします。

4

2 に答える 2

2

モデルにを追加するかvalidates_uniqueness_of :field、データベースでUNIQUE制約を使用するか、またはその両方を行うことができます。

重複したエントリは例外を発生させますが、これをキャッチして無視することができます。

于 2011-08-08T09:59:24.167 に答える
0

もう 1 つの方法は、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エラーをレスキューして処理することもできます。

于 2012-06-12T16:53:12.567 に答える