例如,我使用Post模型和Tag模型获得了简单的应用程序。他们彼此联系在一起很多。我需要找到与任意数量的标签相关联的帖子。 例如,我想查找所有帖子,标记为" Cat"和"森林"标签,但没有标记为" Forest"或者" Cat"。所以,只有猫在森林里。
如何在Rails或原始SQL中运行此类查询?如果我在关联模型上使用IN运算符,比如
PostTag.where(tag_id: [1,2])
我将使用这两个标签中的任何一个获得Post,但我需要交集。我怎么能这样做?
答案 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中这样做的话,那么使用子查询也是一样的。