2011-08-03 85 views
0

我的问题是 - 我怎样才能将一个订单应用到这个视图中的标签? Tag.rb中的“default_scope”在这里不起作用。排序关联

查看

<% @skills.each do |s| %>  
    <ul> 
    <% s.active_positions.collect{|p| p.tags}.flatten.uniq.each do |tag| %> 
    <li><%= link_to tag.name, s %></li> 
    <% end %> 
    </ul> 
<% end %> 

控制器

@skills = Skill.includes(:active_positions => :tags) 

模式

class Skill 
    has_many :tags 
    has_many :positions 
    has_many :active_positions, :class_name => "Position", :conditions => {:hidden => false} 
end 

class Position 
    belongs_to :skill 
    has_and_belongs_to_many :tags 
end 

class Tag 
    belongs_to :skill 
    has_and_belongs_to_many :positions 
    default_scope :order => "sequence ASC" 
end 

SOLUTION

视图

...

<% s.active_positions.collect{|p| p.tags}.flatten.uniq.sort_by{|tag|tag.sequence}.each do |tag| %> 
+2

您也可以通过使用to_proc's.active_positions.collect缩短了代码(& :tags).flatten.uniq.sort_by(&:sequence).each do | tag |' –

+0

感谢提示 – emrass

回答

1

可以使用排序数组进行排序!和/或sort_by!你可以传递一个块,像这样:

@something.to_a.sort_by!{ |entry| entry.attribute }.each ... 

在你的情况,这应该是这样的:

<% s.active_positions.collect{|p| p.tags}.flatten.uniq.sort_by{ |tag| tag.name }.each do |tag| %> 
+0

谢谢。很棒。 –