我有一個方法將提供一個模型對象的數組。其中一些模型的屬性很容易通過使用SQL的幫助來排序。我的意思是,使用。查找(:condition => {})Ruby on Rails:排序對象集合
問題是其他的一些屬性不是。在展示前必須進行計算,修改或做其他事情。然後,我找到了使用集合分類對其進行分類的方法。這是,collection.sort {| a,b | a.something_to_sort < => b.something_to_sort}
OK!這是有效的。但問題是,是否有可能使某些東西變成動態變量的東西?例如,我想從UI添加一個參數,並將其分配給something_to_sort像下面,
HTML
<select name="sort">
<option value="name">Name</option>
<option value="age">Age</option>
<option value="activity.category">Activity</option>
<option value="tax.calculate_personal_income_tax">Income Tax</option>
<option value="tax.calculate_withholding_tax">Withholding Tax</option>
<option value="doctor.name">Doctor's Name</option>
</select>
Rails的
params[:sort] ||= "Age"
@people = Person.find(:all)
@people.sort{|a,b| a.params[:sort] <=> b.params[:sort]} #Note that this is an incorrect syntax
有沒有辦法做到這一點通過不必爲每個排序選項編寫一個排序塊?
附加#1
我只是嘗試這樣做,這是工作了一段排序選項
@people.sort{|a,b| a.send(params[:sort]) <=> b.send(params[:sort])}
這適用於名字和年齡,因爲他們是人的特性(和它的作品了也是peopls的方法)。但對於協會來說,例如tax.calculate_personal_income_tax,事實並非如此。
所以,我的同事告訴我,以創造新的人的方法,calculate_personal_income_tax,然後從tax.calculate_personal_income_tax更改選項值到calculate_personal_income_tax使發送方法將能夠找到這種方法...
def calculate_personal_income_tax
tax.calculate_personal_income_tax
end
但是,這不是我真正想要的。因爲我相信必須有一種方法來訪問這種關聯方法,而無需定義新的模型方法。如果我選擇這樣做,有一天人們的模型變得更大,更多的屬性,更多的信息進行排序和顯示。然後,會有很多像這樣的方法。
另一個原因是,如果我必須定義一個新的方法,該方法應該做一些邏輯,計算或其他,而不僅僅是從其他模型中檢索數據。
附加#2
最後,我只是發現通過添加參數傳遞給了找到方法,訪問其他模型屬性的方式:加入和:選擇。
@people = Person.find(:all, :select => "persons.*, tax.tax_rate AS tax_rate", :joins => :tax, :condition => {some conditions})
的,其結果將是人與稅加入一個表。然後,我用send(params [:sort])這個東西來幫我排序我想要的屬性。
所以你*不能*使用SQL來排序結果? –
是的,一些顯示列不能通過SQL語句進行排序(或者,我不知道如何去做)。其中一些太複雜,因爲它涉及到很多相關的模型 –