2010-09-12 17 views
5

Ich habe 2 Modelle: Notizen und Tags.Rails ActiveRecord: HABTM Parameter finden

class Note < ActiveRecord::Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :notes 
end 

Ein Tag hat einen Namen (zB "rss", "javascript" usw.). Wie kann man alle Notizen mit einer bestimmten Liste von Tags am besten abrufen? Das heißt, ich hätte gerne eine benannte Route wie /notes/with_tags/rss,javascript und benötige eine Klassenmethode für Note namens find_with_tags().

Also, wie ich dies tun:

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

ich derzeit Tag.find_all_by_name(['xml','rss']).map(&:notes).flatten.uniq bin mit, aber ich denke, es muss ein besserer Weg

+0

wie über die Verwendung von Akten-as-markierbare-on-Plugin/gem? – Eimantas

+0

Danke, das habe ich gesehen. Ich habe mich mehr gefragt, wie man so etwas macht. –

Antwort

3

Am Ende ist das, was ich gesucht habe:

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

Sie können dies auch tun, um sein (obwohl ich nicht bin wirklich ein großer Fan von SQL in Abfragen schreiben), die auch alle Notizen mit einem der gelieferten Tag zurückgeben wird.

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