Rails/SQL:查找属于所有而不是任何的

Rails/SQL:查找属于所有而不是任何的,sql,ruby-on-rails,many-to-many,Sql,Ruby On Rails,Many To Many,例如,我得到了一个简单的应用程序,带有Post模型和Tag模型。他们彼此联系,就像有许多人一样。我需要找到与任意数量的标签相关联的帖子。 例如,我想找到所有贴子,贴有“Cat”和“Forest”标签,但没有贴有“Forest”或“Cat”标签的贴子。所以,森林里只有猫 如何在Rails或原始SQL中运行这样的查询?如果我在关联模型上使用IN运算符,如 PostTag.where(tag_id: [1,2]) 我会得到这两个标签中任何一个的帖子,但我需要交集。我怎样才能做到这一点呢?好吧,一个尝

例如,我得到了一个简单的应用程序,带有Post模型和Tag模型。他们彼此联系,就像有许多人一样。我需要找到与任意数量的标签相关联的帖子。 例如,我想找到所有贴子,贴有“Cat”和“Forest”标签,但没有贴有“Forest”或“Cat”标签的贴子。所以,森林里只有猫

如何在Rails或原始SQL中运行这样的查询?如果我在关联模型上使用IN运算符,如

PostTag.where(tag_id: [1,2])

我会得到这两个标签中任何一个的帖子,但我需要交集。我怎样才能做到这一点呢?

好吧,一个尝试就是做如下事情:

post_tag_ids = PostTag.joins(:tags).where('tags.id = 1').pluck(:id) & PostTag.joins(:tags).where('tags.id = 2').pluck(:id)
post_tags = PostTag.find(post_tag_ids)
或者更好

(PostTag.joins(:tags).where('tags.id = 1') & PostTag.joins(:tags).where('tags.id = 2')).uniq
因此,首先查找带有标记1、标记2的post的post_标记ID,然后获取两个集合的交集,并查询它们


大多数情况下,当最简单的方法可能就在他们眼皮底下的时候,人们试图用一条铁轨来完成一项任务。然而,这确实会导致3个查询,所以请记住这一点。如果我在sql中这样做,那么使用子查询也是一样的。

是的,很清楚。我认为可能有更好的解决方案,而不是触发N个查询