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"。
- 然后只选择成员数量与我们所需的标签数组中指定的数量相同的组。
我有与 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"。
- 然后只选择成员数量与我们所需的标签数组中指定的数量相同的组。