ruby on rails - 用复杂的逻辑排序模型集合

时间:2011-07-12 21:30:35

标签: ruby-on-rails ruby ruby-on-rails-3 sorting model

我有一个模型的集合。我想在这个集合上执行一些复杂的排序逻辑。逻辑并不像基于简单属性的排序那么简单。在一组模型上执行复杂排序逻辑的最佳方法(性能和可维护性)。我正在考虑将一个块传递给sort方法?但我不确定......

感谢。

2 个答案:

答案 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:是的,即使你的问题有点模糊,我也会使用积木。