ActiveRecord'all'的替代方案,因为它已被弃用

时间:2013-10-22 21:07:31

标签: ruby activerecord sinatra sinatra-activerecord

ActiveRecord 4.0.0版中的find_each是否可以替代ActiveRecord函数all

例如,之前我曾:

all_users = User.all

会产生一个警告,说明ActiveRelation的内容:所有都已弃用。

作为替代,我提出了:

User.find_each do |user|
  all_users += user
end

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

我理解使用find_each背后的原因是因为'批处理'允许查询在有非常大的数据集时停止运行。我们假设这种情况下数据集很小。

修改

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

User.all(:conditions => ["name like ?", "%bob%"]) 

产生

  

DEPRECATION WARNING:不推荐使用Relation#all。如果你想   急切加载一个信息,你可以调用#load(例如   Post.where(published: true).load)。如果你想得到一个数组   来自关系的记录,您可以调用#to_a(例如Post.wher e(published: true).to_a)。 (从(irb)的irb_binding调用:8)

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

User.where("name like ?", "%bob%")

1 个答案:

答案 0 :(得分:4)

Model.all并未弃用,但已发生变化。它不是返回所有记录的数组,而是返回一个显着更快的ActiveRecord关系。

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

您可以在此article中阅读所有相关内容。