订购集合作为DESC

Sor*_*ami 44 ruby ruby-on-rails

<%= render :partial => 'event', :collection => @events.sort_by(&:event_at)%>
Run Code Online (Sandbox Code Playgroud)

此代码显示按ASC排序的集合,但我想将此集合作为DESC进行排序.

我怎样才能做到这一点?

Yan*_*nis 64

更好的是,您可以设置范围来对事件进行排序并在渲染中使用它.

在您的活动模型中:

scope :desc, order("events.event_at DESC")
Run Code Online (Sandbox Code Playgroud)

如果您使用Rails3,您可以在视图中执行以下操作:

<%= render @events.desc %>
Run Code Online (Sandbox Code Playgroud)

  • 那么没问题,只需调整我的例子:`named_scope:desc,:order =>("events.event_at DESC")`和`<%= render:partial =>'event',:collection => @ events.desc% >` (2认同)

小智 50

http://guides.rubyonrails.org/active_record_querying.html所述

@events.order(event_at: :desc)
Run Code Online (Sandbox Code Playgroud)

  • 这是 Rails 3+ 的最佳答案,因为它无需编写原始 SQL 即可在数据库中进行排序。 (3认同)

Jos*_*phL 12

在Rails 3中,正确的语法是:

<%= render :partial => 'event', :collection => @events.order(:event_at).reverse_order %>
Run Code Online (Sandbox Code Playgroud)


Sha*_*ell 9

您只需反转已排序的集合:

<%= render :partial => 'event', :collection => @events.sort_by(&:event_at).reverse %>
Run Code Online (Sandbox Code Playgroud)

但正如Yannis所说,当您从理想情况下从数据库中获取内容时,您最好进行排序.


小智 7

我想显示一个排名表并按分数排序。在尝试了几种不成功的方法之后,这就是在这种情况下对我有用的方法。我将此行添加到我的控制器索引方法中。

@teams = Team.all.order(points: :desc)
Run Code Online (Sandbox Code Playgroud)


Dam*_*IEU 6

根据您拥有的对象类型,您将有不同的方式来执行排序功能.

如果您的对象是ActiveRecord,您可以通过以下方式执行此操作:

@events.order('events.event_at DESC')
Run Code Online (Sandbox Code Playgroud)

这将添加一个 ORDER您的SQL查询子句,在从数据库中检索它们之前对这些条目进行排序.

第二种解决方案比较慢,因为您要在ruby中对条目进行排序.
但是如果你正在操纵一系列对象,那么这是你唯一的解决方案.

@events.sort {|a,b| b.event_at <=> a.event_at }
Run Code Online (Sandbox Code Playgroud)

这将循环遍历所有事件,检查每个事件中的最大事件 <=>方法.

您还可以在Enumerables上查看排序文档.