我有一个模型的集合。我想在这个集合上执行一些复杂的排序逻辑。逻辑并不像基于简单属性的排序那么简单。在一组模型上执行复杂排序逻辑的最佳方法(性能和可维护性)。我正在考虑将一个块传递给sort方法?但我不确定......
感谢。
答案 0 :(得分:4)
是的,您可以使用sort_by
@people.sort_by { |person| person.age }
sort_by
在sort_by内部使用Schwartzian transform,因此如果您的逻辑比这更复杂,您仍然可以创建评分函数并将其传递给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 :(得分:1)
我建议你阅读this resource,特别是本章:
#21 Using Procs for Filtering (matching_members.rb)
使用Procs和块提供了很好的过滤示例。
PS:是的,即使你的问题有点模糊,我也会使用积木。