按不同属性排序对象数组

时间:2014-07-29 21:53:34

标签: ruby ruby-on-rails-3

我有一个包含三个不同模型的对象数组。其中两个具有类别的共同属性,而我们刚刚添加的第三个属性没有。我想使用前两个的类别名称和第三个的对象名称按字母顺序对数组进行排序。由于它们都是字符串,这似乎是可能的,但我不知道如何使其工作。

我的控制器:

def index
@opportunities = Opportunity.non_historical_active.order("title")
@recommendations = Recommendation.active
@fast_content = FastContent.where(:approved => true)
@skills = (@recommendations + @opportunities + @fast_content)

我视图中显示的数组:

<% Array(@skills.sort_by{ |skill| skill.opportunity_category.name}).each_with_index do |opp, i| %>

在我们将@fast_content变量添加到@skills之前,此数组已运行。

1 个答案:

答案 0 :(得分:2)

假设OpportunityRecommendation应按opportunity_category.name排序,FastContent应按name排序,这样可行:

@skills.sort_by { |skill|
  case skill
  when Opportunity, Recommendation
    skill.opportunity_category.name
  when FastContent
    skill.name
  end
}

另一种选择是为所有三个类添加一个通用方法:

class Opportunity < ActiveRecord::Base
  def sort_name
    opportunity_category.name
  end
end

class Recommendation < ActiveRecord::Base
  def sort_name
    opportunity_category.name
  end
end

class FastContent < ActiveRecord::Base
  def sort_name
    name
  end
end

然后使用它:

@skills.sort_by(&:sort_name)