2011-08-03 5 views
0

ma question est - comment puis-je appliquer une commande aux tags dans cette vue? Le "default_scope" dans Tag.rb ne fonctionne pas ici.trier une association

Voir

<% @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 %> 

Contrôleur

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

modèles

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

dans la vue ...

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

Vous pouvez également raccourcir le code en utilisant to_proc 's.active_positions.collect (& : tags) .flatten.uniq.sort_by (&: séquence) .each do | tag | ' –

+0

Merci pour l'indice – emrass

Répondre

1

Vous pouvez trier les tableaux utilisant le tri! et/ou sort_by! Vous pouvez passer un bloc comme ceci:

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

Dans votre cas, cela devrait être quelque chose comme:

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

Merci. Fonctionne très bien. –