Rails アプリにメソッドを実装してsync
いますが、SQL クエリが間違った順序で実行され、同期が乱れています。
基本的に、クライアント アプリから新しいオブジェクトを最後の同期のタイムスタンプと共に送信し、そのタイムスタンプ以降にサーバー上で変更されたものを取得します。次に、クライアントから新しいオブジェクトを作成し、新しいオブジェクトが作成された後にタイムスタンプを保存して、次の同期から除外します。
def sync(new_obj_hashes, last_sync)
updated_items = Item.where(user_id: user_id).where("updated_at > ?", last_sync)
new_obj_hashes.each |obj_hash|
Item.new(obj_hash).save!
end
last_sync = Time.now
end
問題: SQL ログから
UPDATE "items" SET ...blah blah... WHERE "items"."id" = x
SELECT "items".* FROM "items" WHERE "items"."user_id" = y AND (updated_at > z)
最初に新しいオブジェクトを作成してから、更新されたオブジェクトをフェッチします。つまり、updated_items (クライアント アプリに送り返す) には、クライアントが送信したすべてのオブジェクトも含まれます。
UPDATE の前に SELECT ステートメントを実行するにはどうすればよいですか?