Мое приложение о профилях, которые имеют много желаний, связанных с фильмами:
class Profile < ApplicationRecord
has_many :wishes, dependent: :destroy
has_many :movies, through: :wishes
end
class Wish < ApplicationRecord
belongs_to :profile
belongs_to :movie
end
class Movie < ApplicationRecord
has_many :wishes, dependent: :destroy
has_many :profiles, through: :wishes
end
Я хотел бы вернуть все фильмы, которые все"желательны" по профилям с идентификаторами 1,2 и 3.
Мне удалось получить этот запрос с использованием необработанного SQL (postgres), но я хотел узнать, как это сделать с ActiveRecord.
select movies.id
from movies
join wishes on wishes.movie_id = movies.id
join profiles on wishes.profile_id = profiles.id and profiles.id in (1,2,3)
group by movies.id
having count(*) = 3;
(Я полагаюсь на count (*) = 3, потому что у меня есть уникальный индекс, который предотвращает создание желаний с дублированными парами profile_id-movie_id, но я открыт для лучших решений)
На данный момент лучший подход, который я нашел, это:
profiles = Profile.find([1,2,3])
Wish.joins(:profile, :movie).where(profile: profiles).group(:movie_id).count.select { |_,v| v == 3 }
(Также я бы начал запрос AR с Movie.joins, но мне не удалось найти способ: -)