【发布时间】:2011-12-01 04:07:14
【问题描述】:
我有一个方法可以提供一个模型对象数组。通过使用 SQL 的帮助,可以很容易地对这些模型的一些属性进行排序。我的意思是,使用 .find(:condition => {})
问题是其他一些属性不是。它必须在显示之前进行计算、修改或执行其他操作。然后,我找到了使用集合排序对其进行排序的方法。也就是说,collection.sort{|a,b| a.something_to_sort b.something_to_sort}
好的!那是有效的。但问题是,是否有可能使 something_to_sort 部分成为动态变量?例如,我想从 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>
导轨
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])}
这适用于姓名和年龄,因为它们是人们的属性(它也适用于人们的方法)。但是对于诸如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
最后,我刚刚找到了访问其他模型属性的方法,方法是在 find 方法、:join 和 :select 中添加 args >.
@people = Person.find(:all, :select => "persons.*, tax.tax_rate AS tax_rate", :joins => :tax, :condition => {some conditions})
结果将是 person 与 tax 连接的表格。然后,我使用 send(params[:sort]) 东西来帮助我对我想要的属性进行排序。
【问题讨论】:
-
所以你不能使用 SQL 来排序结果?
-
是的,有些显示列不能通过SQL语句排序(或者可能我还不知道怎么做)。其中一些过于复杂,因为它涉及许多相关模型
标签: ruby-on-rails ruby-on-rails-3