2014-01-26 3 views
0

Хорошо, я чувствую, что бегу в кругах.Потерянный с Rails has_many: через множественный поиск

У меня есть следующие модели: Рельсы

class Image < ActiveRecord::Base 
    has_many :image_tags 
    has_many :tags, :through => :image_tags 
end 

class Tag < ActiveRecord::Base 
    has_many :image_tags 
    has_many :images, :through => :image_tags 
end 

class ImageTag < ActiveRecord::Base 
    belongs_to :image 
    belongs_to :tag 
end 

Так в основном у меня есть изображения, у меня есть метки, и изображения могут иметь все виды тегов.

Если я хочу найти каждое изображение с одним тегом, это легко, не так ли?

def Image.find_by_tag(t) 
    includes('tags').where(['tags.name = ?', t]).references(:tags) 
end 

Но я потянув меня за волосы, пытаясь выяснить, как искать несколько тегов одновременно (например, найти все изображения, которые, например, как помечено как «смешной» и «политические»).

Image.find_by_tag('funny').find_by_tag('political') всегда поставляется с пустым набором, даже если имеется несколько изображений, помеченных как оба.

Любая помощь очень ценится!

ответ

0

Try с in:

def self.by_tags(t) 
    includes('tags').where('tags.name in(?)', t.map(&:name)).references(:tags) 
end 

Обратите внимание, что это необходимо, чтобы параметр t быть массив, содержащий объекты, которые отвечают name атрибута.

+0

Не уверен в этом, но если вы использовали бы .collect (&: name) вместо карты, t также может быть отношением activerecord, правильно? – Ninigi

Смежные вопросы