2010-10-20 97 views
32
<%= render :partial => 'event', :collection => @events.sort_by(&:event_at)%> 

此代碼顯示作爲ASC訂購的集合,但我想將此集合訂購爲DESC。以DESC訂購集合

我該如何做到這一點?

回答

53

更好的是,你可以設置一個範圍來排序你的事件並在渲染中使用它。

在你的事件模型:

scope :desc, order("events.event_at DESC") 

如果使用Rails3中,在你看來,你可以簡單地做:

<%= render @events.desc %> 
+0

我使用rails 2.3.5 :( – 2010-10-20 09:43:08

+2

然後沒問題,只適應我的例子:'named_scope:desc,:order =>(「events .event_at DESC「)'和'<%= render:partial =>'event',:collection => @ events.desc%>' – Yannis 2010-10-20 10:09:20

+0

當我試着這樣的時候, :desc,:order =>(「events.event_at DESC」),然後試圖用<%= render:partial =>'event',:collection => @ events.desc%>來調用它,但是我得到了錯誤:未定義的方法'desc'爲# 2010-10-20 11:04:02

4

根據您擁有的對象類型,您將有不同的排序功能。

如果你的對象是一個ActiveRecord,你可以做到這一點通過以下方式:

@events.order('events.event_at DESC') 

您從數據庫中檢索他們面前這一個ORDER條款添加到您的SQL查詢,排序項。

第二種解決方案比較慢,因爲您在紅寶石中排序條目。
但是,如果您操縱的是一組對象,那麼這是您唯一的解決方案。

@events.sort {|a,b| b.event_at <=> a.event_at } 

通過所有的事件時,這將循環,檢查最大的一個與<=>方法他們中的每一個。

您還可以在Enumerables上看到the sort documentation

+0

對不起,但我是一個新手在紅寶石和鐵軌上。什麼是a,b代表什麼?你能用真名寫一個例子嗎?最好在events_at – 2010-10-20 09:22:44

+0

a和b是陣列的兩個元素。你指定你想要第一個之前的第二個。 – 2010-10-20 09:24:15

+0

你的例子應該是:<%= render:partial =>'event',:collection => @ events.sort {| a,b |灣event_at <=> a.event_at}%> – Yannis 2010-10-20 09:36:52

8

你可以只扭轉有序集合:

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

但正如Yannis所說的,當你從數據庫理想地獲取數據時,你最好進行排序。

+0

這使它工作。但我想嘗試其他的學習例子。 – 2010-10-20 11:04:29

36

像描述。

見例如

@events.desc(:event_at) 

下面這會給你@events在event_at領域的降序排列。

謝謝。

+1

這是Rails 3+的最佳答案,因爲它可以在數據庫中進行排序而無需編寫原始SQL。 – DaveMongoose 2016-08-04 10:11:27

1

你可以做到這一點

<%= render :partial => 'event', :collection => @events.order(:event_at).reverse_order %>