0

例如,我有一个带有 Post 模型和 Tag 模型的简单应用程序。它们相互关联,就像 has-many 一样。我需要找到与任意数量的标签相关联的帖子。例如,我想查找所有带有“Cat”和“Forest”标签的帖子,而不是带有“Forest”或“Cat”标签的帖子。所以,只有猫在森林里。

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

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

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

4

1 回答 1

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

因此,您首先找到带有标签 1 的帖子的 post_tag id,然后是标签 2,然后获取两组的交集,并查询这些。

大多数时候,人们试图在轨道上使用一个衬垫来完成一项任务,而最简单的方法可能就在他们的眼皮底下。然而,这确实会导致 3 个查询,因此请记住这一点。如果我要在 sql 中执行此操作,那么使用子查询将是同样的事情。

于 2013-05-14T20:23:10.970 回答