Rails 4:ActiveRecord“all”的替代方案,因为它现已弃用

Rot*_*ots 4 ruby activerecord sinatra ruby-on-rails-4 sinatra-activerecord

ActiveRecord 4.0.0 版本中的ActiveRecord 功能是否find_each可以接受替代?all

例如,之前我有:

all_users = User.all
Run Code Online (Sandbox Code Playgroud)

它会产生一条警告,指出类似于 ActiveRelation:all 的内容已被弃用。

作为替代,我想出了:

User.find_each do |user|
  all_users += user
end
Run Code Online (Sandbox Code Playgroud)

这是可以接受的,还是我应该以另一种方式做?

我理解使用背后的原因find_each是因为“批处理”,如果存在非常大的数据集,它将允许查询停止运行。我们假设这种情况下数据集很小。

编辑

似乎只有当您使用条件时才会出现弃用错误,例如:

User.all(:conditions => ["name like ?", "%bob%"]) 
Run Code Online (Sandbox Code Playgroud)

产生:

弃用警告:Relation#all 已弃用。如果你想立即加载一个关系,你可以调用#load(例如 Post.where(published: true).load)。如果你想从关系中获取记录数组,你可以调用#to_a(例如Post.wher e(published: true).to_a)。(从 (irb):8 处的 irb_binding 调用)

上述内容的正确替换似乎是:

User.where("name like ?", "%bob%")
Run Code Online (Sandbox Code Playgroud)

Col*_*ent 6

Model.allRails 4 中并未弃用,但它已经发生了变化。它不是返回所有记录的数组,而是返回一个 ActiveRecord Relation,这要快得多。

Model.all旨在弃用Model.scoped先前延迟加载的记录。Model.all现在可以用于更轻松地链接方法而不是scoped.

您可以在本文中阅读有关它的所有内容。