2010-09-12 7 views
5

J'ai 2 modèles: notes et étiquettes.Rails ActiveRecord: HABTM trouver les paramètres

class Note < ActiveRecord::Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :notes 
end 

Une étiquette a un nom (par exemple. "Rss", "javascript", etc.). Quelle est la meilleure façon de récupérer toutes les notes qui ont une certaine liste de balises? C'est-à-dire, je voudrais avoir une route nommée comme /notes/with_tags/rss,javascript et besoin d'une méthode de classe sur Note appelée find_with_tags().

Alors, comment dois-je faire ceci:

class Note 
    def self.find_with_tags(tags) 
    ????? 
    end 
end 

J'utilise actuellement Tag.find_all_by_name(['xml','rss']).map(&:notes).flatten.uniq, mais je pense qu'il doit y avoir une meilleure façon

+0

comment sur l'utilisation des actes-comme-tagable sur le plugin/gem? – Eimantas

+0

Merci, j'ai vu ça. Je me demandais plus sur les mécanismes de la façon dont vous feriez quelque chose comme ça. –

Répondre

3

En fin de compte, ce que j'ai cherché:

Note.find(:all, :include=>:tags, :conditions => ['tags.name in (?)',['rss','xml']]) 
1

Vous pouvez aussi le faire (bien que je ne suis pas vraiment un grand fan de l'écriture sql dans les requêtes), qui renverra également toutes les notes avec l'un de la balise fournie.

class Note < ActiveRecord::Base 
    has_many :notes_tags 
    has_many :tags, :through => :notes_tags 

    def self.find_with_tags(*tags) 
    all(:joins => :notes_tags, :conditions => ["notes_tags.tag_id in (select id from tags where name in (?))", tags], :group => 'notes.id') 
    end 

end 
Questions connexes