我的应用程序是关于有许多愿望的配置文件,这与电影:
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
我想返回所有的电影是所有“希望”的个人资料与id 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对的Wishes,但我愿意接受更好的解决方案)
目前我发现的最好的方法是这样的:
profiles = Profile.find([1,2,3])
Wish.joins(:profile, :movie).where(profile: profiles).group(:movie_id).count.select { |_,v| v == 3 }
(Also我会用Movie.joins来开始AR查询,但我没有找到一种方法:-)
2条答案
按热度按时间dxxyhpgq1#
由于我们想要的是Movies的集合,ActiveRecord查询需要从Movie开始。我缺少的是我们可以在查询中指定表,比如
where(profiles: {id: profiles_ids})
。下面是我正在寻找的查询:(是的,使用
count
可能听起来有点脆弱,但另一种选择是昂贵的SQL子查询。此外,我认为如果您使用多列唯一索引,这是安全的。)cclgggtu2#
由于belongs_to将外键放在wishes表中,因此您应该能够像这样查询您的配置文件:
这应该会让你得到一个由这三个配置文件组成的所有电影的数组,渴望加载电影。