Rails находит по * всем * связанным тегам.id в - PullRequest
0 голосов
/ 02 апреля 2010

Скажите, что у меня есть теги taggable has_many, как мне найти все теги taggable по полю связанных тегов taggable_id?

Taggable.find(:all, :joins => :tags, :conditions => {:tags => {:taggable_id => [1,2,3]}})

результатов в этом:

SELECT `taggables`.* FROM `taggables` INNER JOIN `tags` ON tags.taggable_id = taggables.id WHERE (`tag`.`taggable_id` IN (1,2,3))

Синтаксис невероятен, но не соответствует моим потребностям в том, что полученный sql возвращает любой taggable, который имеет какие-либо, некоторые или все теги.

Как мне найти теги с соответствующими тегами поля taggable_id со значениями 1, 2 и 3?

Спасибо за любой совет. :)

UPDATE:

Я нашел решение, которое я опубликую для других, если они окажутся здесь. Кроме того, хотя за внимание других, чьи предложения по улучшению я бы с радостью получил. :)

Taggable.find(:all, :joins => :tags, :select => "taggables.*, tags.count tag_count", :conditions => {:tags => {:taggable_id => array_of_tag_ids}}, :group => "taggables.id having tag_count = #{array_of_tag_ids.count}"))

1 Ответ

0 голосов
/ 02 апреля 2010

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

Taggable.find([1,2,3], :include => :tags).tags.map { |t| t.taggables }

или (если вы хотите, чтобы результаты были уникальными, что вы, вероятно, делаете):

Taggable.find([1,2,3], :include => :tags).tags.map { |t| t.taggables }.flatten.uniq

Это относится ко всем taggables, которые имеют те же теги, что и taggables, которые имеют идентификаторы 1,2 и 3. Это то, что вы хотели?

...