HABTM multi"和"询问

时间:2016-06-30 13:11:43

标签: sql ruby-on-rails database activerecord has-and-belongs-to-many

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

我需要使用"和"过滤标签数组。查询。

对于下面的标签,我需要每一个" Salami"和#34;比萨"已过期。

tags = [" Salami"," Pizza","已过期"] //项目可以是1中的任意数字。 .N

我想出了以下内容,但这会让每一个" Salami"和#34;比萨"哪些都没有过期。这也返回了所有过期的物品,这些物品不是萨拉米香肠也不​​是披萨

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

1 个答案:

答案 0 :(得分:1)

如果您确实想要使用"和"对于所有标签,您可以这样做:

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

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

它的作用是:

  • 获取包含所需标签之一的所有文章
  • 对它们进行分组,以便当文章有标签时,我们就会有一组3个;#34; Salami"," Pizza"和#34;过期",或者当文章有标签时只是一组2" Salami"," Pizza"和" Fish"。
  • 然后,只使用我们所需的标签数组中指定的成员数量的那些组。