これが私の状況です。Shopify ショップから API 経由でデータを取得し、データベースに保存しています。私の問題は、重複レコードがデータベースに侵入するのを防ぐ方法です。これに関するコードスニペットはありますか? ありがとうございました!すべてのエントリがデータベースに何度も入力されるのではなく、ショップから作成された新しいエントリのみが保存されるようにします。
2 に答える
モデルにを追加するかvalidates_uniqueness_of :field
、データベースでUNIQUE制約を使用するか、またはその両方を行うことができます。
重複したエントリは例外を発生させますが、これをキャッチして無視することができます。
もう 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
エラーをレスキューして処理することもできます。