2011-07-12 33 views
2

我有一個模型的集合。我想在這個集合上執行一些複雜的排序邏輯。邏輯不像基於簡單屬性的排序那麼簡單。在一組模型上執行復雜排序邏輯的最佳方法(性能和可維護性)是什麼。我正在考慮在排序方法中傳遞一個塊?但我不知道...軌道上的紅寶石 - 複雜的邏輯排序模型集合

謝謝。

回答

4

是的,你可以使用使用sort_by

@people.sort_by { |person| person.age } 

sort_by塊使用Schwartzian transform在內部sort_by,所以如果你的邏輯是比這稍微複雜一些,你仍然可以創建一個打分函數,並將它傳遞到sort_by

@people.sort_by do |person| 
    tier = if person.deceased? 
    2 
    elsif !person.important? 
    1 
    else 
    0 
    end 
    [tier, person.age 
end 

問問自己,如果你不能直接從SQL查詢排序,這將是快了很多(假設正確的查詢和索引)

@people = Person.all(:select => "*, (age + popularity) as coolness", :order => "coolness") 
1

我建議你閱讀this resource,本章具體爲:

#21 Using Procs for Filtering (matching_members.rb) 

有使用特效,板塊給予了極大的過濾的例子。

PS:是的我會用塊,即使你的問題有點含糊。