【问题标题】:How do I order database records in rails by most recent?我如何按最近的顺序对 Rails 中的数据库记录进行排序?
【发布时间】:2014-01-12 22:42:41
【问题描述】:

我想订购模型Item 中的所有项目,因此它首先显示最新的项目。根据Rails guide,下面的代码应该可以工作:

 Item.order("created_at DESC")

但是,当我在终端中键入该(或变体)时,最新的项目总是最后显示,这就是它们在我的页面上显示的方式。我如何在他最近的情况下有效地检索它们? (我将在每个页面上一次只显示其中一些。)

请注意,我的默认项目范围是最旧的。

更新: 这是我得到的 SQL:

SELECT "cmets".* FROM "cmets" ORDER BY cmets.created_at ASC, created_at DESC

所以我想我不应该使用默认范围......

【问题讨论】:

  • 您发布的查询是正确的。一定有别的东西与之相冲突。发布执行的 SQL(可以在控制台中看到)。

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord


【解决方案1】:

您发布的查询是正确的

Item.order("created_at DESC")

它不起作用的唯一原因是是否有其他任何与它相冲突的东西。通常,冲突由default_scope 表示。

如果您有覆盖订单的默认范围,您应该首先unscope 查询

Item.unscoped { Item.order("created_at DESC") } 

如果您使用默认范围,我强烈建议您避免使用它们。它们很难调试和取消范围。

在极少数情况下默认范围是有意义的。您可以在控制器中的选择时间简单地传递(默认)范围或为其创建自定义方法。

【讨论】:

  • 谢谢,我没有意识到 default_scope 是如此难以覆盖。我想我会用命名范围替换它。
【解决方案2】:

我意识到这是一个非常古老的问题,但没有一个答案包含不编写原始 SQL 的解决方案,从 Rails 3+ 开始就可以使用:

Item.order(created_at: :desc)

或使用reverse_order 方法:

Item.order(:created_at).reverse_order

http://guides.rubyonrails.org/active_record_querying.html#ordering查看更多信息 和 http://guides.rubyonrails.org/active_record_querying.html#reverse-order.

【讨论】:

    【解决方案3】:

    我用reverse 修改了 CDub 的答案,所以它现在可以工作了:

     Item.order(:created_at).reverse
    

    我仍然不确定为什么 Rails 指南的方式不起作用。此外,上述方法不适用于分页。

    【讨论】:

    • 这是非常低效的。首先加载所有按created_at ASC 排序的记录,然后在Ruby 中反转数组。让数据库引擎执行排序。
    【解决方案4】:

    Item.unscoped.order('created_at DESC') should work.当记录数增加时使用反向可能会降低性能

    【讨论】:

      【解决方案5】:

      正确并经过测试

      @purchase_orders = current_company.purchase_orders.order(:date)
      @purchase_orders = @purchase_orders.reverse_order 
      

      【讨论】:

        【解决方案6】:

        可以添加也可以在Item模型中定义默认顺序

        default_scope order('created_at DESC') 
        

        【讨论】:

        • 但我想与 Item 模型中的默认范围不同。
        • 虽然我可以更改模型项目所属的默认范围,但最初并没有工作..
        • 你可以试试 Item.all.order("created_at DESC")
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 2012-12-08
        • 2018-04-25
        • 2017-07-20
        • 2021-11-04
        • 1970-01-01
        相关资源
        最近更新 更多