Rails ActiveRecord SQL查询无序

Rails ActiveRecord SQL查询无序,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我在rails应用程序中实现了一个sync方法,但是我的SQL查询执行的顺序错误,导致了同步的混乱 基本上,我从客户端应用程序发送新对象以及上次同步的时间戳,然后获取自时间戳以来服务器上发生的任何更改。然后,我从客户端创建新对象,并在创建新对象后保存时间戳,以将其从下一次同步中排除 def sync(new_obj_hashes, last_sync) updated_items = Item.where(user_id: user_id).where("updated_at > ?"

我在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)
它首先创建新对象,然后获取更新的对象,这意味着更新的项目(我发送回客户端应用程序)也包含客户端发送的所有对象

我如何在更新之前获得SELECT语句

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\u items

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

在你的情况下,听起来像是你想做的

updated_items = Item.where(user_id: user_id).where("updated_at > ?", last_sync).all
这样就可以在那时而不是下次使用
updated\u items