【问题标题】:Rails 4: alternative for ActiveRecord 'all' as it is now deprecatedRails 4:ActiveRecord 'all' 的替代品,因为它现在已被弃用
【发布时间】:2013-10-22 21:07:31
【问题描述】:

在 ActiveRecord 4.0.0 版本中,find_each 是否可以替代 ActiveRecord 函数 all

例如,以前我有:

all_users = User.all

它会产生一条警告,说明 ActiveRelation:all 已被弃用。

作为替代我想出了:

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

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

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

编辑

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

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

产生:

弃用警告: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%")

【问题讨论】:

  • 我不认为链接的问题与此完全相同,因为他们只想要 5 条记录并按顺序排列。另外在搜索ActiveRecord all deprecation的时候没有出现那篇文章,是因为标题吗?当我在 irb 中尝试时,Hallucynogenyc 的答案不起作用。 EG:使用UserUser.to_a 似乎无效。
  • 别担心,仅供参考 - 这不是 Rails。

标签: ruby ruby-on-rails-4 activerecord sinatra sinatra-activerecord


【解决方案1】:

Model.all 在 Rails 4 中没有被弃用,但它已经改变了。它不是返回所有记录的数组,而是返回一个明显更快的 ActiveRecord Relation。

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

您可以在此article 中阅读所有相关信息。

【讨论】:

  • .all 不是已弃用吗?
  • 是的,新语法(我猜)是Model.scoped,这样更容易链接。
  • 你能举个例子说明你如何使用Model.scoped而不是Model.all吗?它比使用Model.find_each 更好吗?为什么?
  • 因此使用find_each 将遍历每条记录。 scoped 只会延迟加载记录,这要快得多。对于小型数据集,这并不是什么大问题,但为了可扩展性,您可能希望在一个块中使用 scoped 而不是 find each
  • 谢谢。因此,要获取所有记录,您只需键入 Model.scoped ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多