Rails 4关系#所有弃用

Mat*_*ski 14 ruby-on-rails ruby-on-rails-4 rails-activerecord

在我的应用中,我创建了最近的帖子功能.

 @recentposts = Post.all(:order => 'created_at DESC', :limit => 5)
Run Code Online (Sandbox Code Playgroud)

这个变量有些麻烦.当我运行测试时,我有以下错误:

弃用警告:不推荐使用Relation#all.如果您想要加载关系,可以调用#load(例如Post.where(published: true).load).如果要从关系中获取记录数组,可以调用#to_a(例如Post.where(published: true).to_a).(来自/home/mateusz/rails4/Bloggers/app/controllers/users_controller.rb:18上的节目)

我在Google上搜索解决方案,但我找不到它......

nat*_*vda 19

写吧:

@recentposts = Post.order('created_at DESC').limit(5)
Run Code Online (Sandbox Code Playgroud)

to_a不是明确必要的,因为数据在需要时是延迟加载的.


blu*_*llu 10

一个调用Post.all将返回一个ActiveRecord::Relation,默认情况下会懒惰加载.呼叫Post.all.load将返回一个急切的负载ActiveRecord::Relation.最后,调用Post.all.to_a将返回数组中的所有记录.

在你的情况下,你会做:

Post.order('created_at DESC').limit(5).to_a
Run Code Online (Sandbox Code Playgroud)

这将返回前5个帖子的数组,按created_at降序排序.

  • 如果我直接在类上使用to_a,我会得到错误:Rails 4中的#<Class:0x007fa23b6d6750>`的'undefined方法`to_a'. (4认同)
  • @LaurieYoung不幸的是,这是一个误导性的答案.为了清楚起见,`Model.all`已经**不被弃用,但是(例如),`Model.where(something:true).all`已被弃用,转而支持`Model.where(某事:true) ).load`如果你想急切地加载数据和`.to_a`,如果你明确想要返回一个记录数组.参考:https://github.com/rails/rails/pull/12904#issuecomment-28617504 (2认同)