2010-09-12 3 views
5

У меня есть 2 модели: заметки и теги.Rails ActiveRecord: HABTM найти параметры

class Note < ActiveRecord::Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :notes 
end 

Тег имеет имя (например, «rss», «javascript» и т. Д.). Каков наилучший способ получить все заметки с определенным списком тегов? То есть, я хотел бы иметь именованный маршрут, например /notes/with_tags/rss,javascript, и нужен метод класса в примечании с именем find_with_tags().

Итак, как я это делаю:

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

настоящее время я использую Tag.find_all_by_name(['xml','rss']).map(&:notes).flatten.uniq, но я думаю, что должен быть лучший способ

+0

как об использовании актов-как-taggable-на плагин/драгоценный камень? – Eimantas

+0

Спасибо, я это видел. Мне было интересно узнать о механизме того, как вы будете делать что-то подобное. –

ответ

3

В конце концов, это то, что я искал:

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

Вы также можете сделать это (хотя я не действительно большой поклонник написания sql в запросах), который также вернет все заметки с одним из предоставленных тегов.

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 
Смежные вопросы