1

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 ステートメントを実行するにはどうすればよいですか?

4

1 に答える 1

1
updated_items = Item.where(user_id: user_id).where("updated_at > ?", last_sync)

SQL ステートメントを実行しません。ActiveRecord::Relationこれを必要とするメソッドを呼び出すと、それ自体が実行されるオブジェクトを作成します (たとえばallEnumerable.

あなたの場合、あなたがやりたいように聞こえます

updated_items = Item.where(user_id: user_id).where("updated_at > ?", last_sync).all

次に使用するときではなく、そのときにクエリが評価されるようにしますupdated_items

于 2012-08-21T10:31:55.697 に答える