如何按最新顺序在rails中排序数据库记录?

am-*_*ils 4 postgresql activerecord ruby-on-rails ruby-on-rails-3

我要订购模型中的所有项目,Item以便它首先显示最新的项目。根据Rails指南,以下代码应该起作用:

 Item.order("created_at DESC")
Run Code Online (Sandbox Code Playgroud)

但是,当我在终端中键入该(或多个)品种时,最新的项目始终显示在最后,这就是它们在我的页面上显示的方式。我如何有效地从他最近的第一人那里检索到它们?(我将在每个页面上一次只显示其中一些。)

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

更新: 这是我得到的SQL:

选择“评论”。*从“评论”中按评论排序。created_atASC,created_at DESC

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

am-*_*ils 5

我使用修改了CDub的答案,reverse因此现在可以使用:

 Item.order(:created_at).reverse
Run Code Online (Sandbox Code Playgroud)

我仍然不确定为什么Rails指南的方法行不通。同样,上述方法在分页时效果也不佳。

  • 这是非常低效的。首先,您加载所有记录(按created_at ASC排序),然后在Ruby中反转数组。让数据库引擎执行排序。 (6认同)

Sim*_*tti 5

您发布的查询是正确的

Item.order("created_at DESC")
Run Code Online (Sandbox Code Playgroud)

它不起作用的唯一原因是,如果还有其他冲突。通常,冲突用表示default_scope

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

Item.unscoped { Item.order("created_at DESC") } 
Run Code Online (Sandbox Code Playgroud)

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

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


qqb*_*enq 5

我意识到这是一个非常老的问题,但是所有答案都包含未编写原始SQL的解决方案,该语言自Rails 3+起可用:

Item.order(created_at: :desc)
Run Code Online (Sandbox Code Playgroud)

或使用reverse_order方法:

Item.order(:created_at).reverse_order
Run Code Online (Sandbox Code Playgroud)

请访问http://guides.rubyonrails.org/active_record_querying.html#orderinghttp://guides.rubyonrails.org/active_record_querying.html#reverse-order了解更多信息。