HABTM 多 "and" 查询

HABTM multi "and" query

我有与 HABTM 相关的文章和标签记录。

我需要使用 "and" 查询按标签数组过滤文章。

对于下面的标签,我需要每个 "Salami" 和 "Pizza" 过期的标签。

tags = ["Salami", "Pizza", "Expired"] // 项目可以是 1..n[= 中的任意数字12=]

我想到了以下内容,但是这个 return 每个 "Salami" 和 "Pizza" 都没有过期。这也 return 所有不是意大利腊肠或比萨饼的物品都过期了

def tags_query
    render status: 200, json: Article.includes(:tags).where('tags.name' => params[:tags] )
end

如果您真的想使用 "and" 查询所有标签,您可以这样做:

required_tags = ["Salami", "Pizza", "Expired"]

Article.joins(:tags)
       .where(tags: { name: required_tags })
       .group('articles.id')
       .having('count(*) = ?', required_tags.count)

它的作用是:

  • 获取标签中包含所需标签之一的所有文章
  • 将它们分组,例如,当文章具有标签 "Salami"、"Pizza" 和 "Expired" 时,我们有一组 3 个,或者只有一组 2 个,当文章有标签 "Salami"、"Pizza" 和 "Fish"。
  • 然后只选择成员数量与我们所需的标签数组中指定的数量相同的组。