Rails / SQL:查找哪个属于所有属性,而不是任何属性

时间:2013-05-14 19:46:25

标签: sql ruby-on-rails many-to-many

例如,我使用Post模型和Tag模型获得了简单的应用程序。他们彼此联系在一起很多。我需要找到与任意数量的标签相关联的帖子。 例如,我想查找所有帖子,标记为" Cat"和"森林"标签,但没有标记为" Forest"或者" Cat"。所以,只有猫在森林里。

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

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

我将使用这两个标签中的任何一个获得Post,但我需要交集。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

一次尝试就是做以下事情:

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

所以你首先找到post的标签id,标签为1,然后标记为2,然后获取两个集合的交集,并查询这些集合。

大多数时候,当最简单的方式可能在他们的鼻子下面时,人们试图用铁轨中的一个衬里来完成任务。但是,这会导致3个查询,因此请记住这一点。如果我是在sql中这样做的话,那么使用子查询也是一样的。