【问题标题】:Rails 4 Relation#all deprecationRails 4 关系#all 弃用
【发布时间】:2013-08-13 08:02:01
【问题描述】:

在我的应用中,我创建了一个最近发布的功能。

 @recentposts = Post.all(:order => 'created_at DESC', :limit => 5)

这个变量会带来一些麻烦。当我运行测试时,出现以下错误:

弃用警告: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 上搜索解决方案,但没有找到...

【问题讨论】:

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


    【解决方案1】:

    只写:

    @recentposts = Post.order('created_at DESC').limit(5)
    

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

    【讨论】:

    • 虽然我全力以赴进行延迟加载,但他要求的是等效行。如果他正在迁移代码,他可能希望一切都尽可能接近正确?
    • 我试着提前一步思考。是的,如果OP想要的是相同的。在别无选择之前,我个人认为最好只在需要时加载数据。例如。这样您仍然可以在以后进行改进并在需要时添加范围。这可以生成非常干净的代码。
    • 是的,我已经说过我完全支持延迟加载,但同样,如果他只是想迁移应用程序,那么保持一切尽可能接近可能是最好的主意,除非他足够了解应用程序来改变它。
    • 所以,如果您认为延迟加载是个好主意:为什么不立即迁移到它呢?通常它根本没有什么区别。 OP 可能只是迭代视图中的帖子,因此延迟加载很可能是完美的。 OP 将决定她/他是否可以使用它,以及其他有相同问题的读者。你不必同意这个答案。
    • 如果我不同意,我会投反对票,但我没有。我同意您的代码更好,这样更改核心函数调用很危险。它通常不会产生影响,但它可能会一次又一次地,他只是对迁移代码感兴趣,而不是改进它。我只是这么说,让他知道:)
    【解决方案2】:

    Post.all 的调用将返回ActiveRecord::Relation,默认情况下会延迟加载。调用Post.all.load 将返回一个热切加载的ActiveRecord::Relation。最后,调用Post.all.to_a 将返回一个数组中的所有记录。

    在你的情况下,你会这样做:

    Post.order('created_at DESC').limit(5).to_a
    

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

    【讨论】:

    • 不确定你在第二行中提出了什么,但这根本不起作用。
    • 如果我直接在类上使用 to_a,我会得到错误:undefined method to_a' for #<0x007fa23b6d6750>
    • &lt;&gt;
    • <b></b>
    【解决方案3】:

    嵌套方式

    Post.order('created_at DESC').limit(5).to_a
    

    【讨论】:

    • 感谢大家的帮助:)
    • @MateuszUrbański 所以,如果你已经有了答案,请给予一些爱,并将选择的答案标记为正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多