Найти запись, которая имеет ВСЕ связанные записи - PullRequest
3 голосов
/ 05 августа 2010

Скажем,

у нас есть модели "Персона" и "Фаворит".

"Фаворит" - это то, что любит этот человек: "музыка", "видео", "спорт","Интернет", "Путешествия" и т. д.

"Персона" HABTM "Избранное" и "Любимый" HABTM "Персоны"

Мне нужно найти человека, у которого ВСЕ перечисленные "ИзбранноеНапример, найти человека, который любит «музыку», «путешествия» и «спорт».

Как это можно сделать, используя метод ActiveRecord.find?

1 Ответ

5 голосов
/ 05 августа 2010
@people = Person.find(:all, 
   :joins => :favourites,
   :select => "person.*, count(favourites) favourite_count", 
   :conditions => {:favourites => @array_of_favourites}, 
   :group => "persons.id having favourite_count = #{@array_of_favourites.count}")

Вам понадобится что-то подобное, чтобы найти людей с всеми избранными, а не любой комбинацией избранных.Это основано на предположении, что у вас есть массив избранных объектов, а не набор строк.

Совместимое с Rails 4 решение:

@people = Person.joins(:favourites)
  .where(favourites: { id: @array_of_favourites })
  .group("people.id")
  .having("count(favourites.id) = #{@array_of_favourites.count}")
...