1

sync在我的 rails 应用程序中实现了一个方法,但是我的 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(我将其发送回客户端应用程序)也包含客户端发送的所有对象。

如何让 SELECT 语句在 UPDATE 之前发生?

4

1 回答 1

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

不执行 SQL 语句。它会创建一个ActiveRecord::Relation对象,当您调用需要它的方法时(例如all或大多数来自Enumerable.

在你的情况下听起来你想做

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

这样查询就会被评估,而不是在你下次使用时updated_items

于 2012-08-21T10:31:55.697 回答