0

出于这个问题的目的,假设我正在构建 Stack Overflow。

Posts我通过and的关联表建立了多对多关系Tags,我想搜索包含多个标签的帖子。

我可以搜索包含单个标签的帖子,如下所示:

scope :has_tag, lambda { |tag| includes(:tags).where("lower(tags.name) = ?", tag.downcase) }

Post.has_tag("Python")

为了搜索多个标签,我尝试使用循环构建查询:

def self.has_tags(tags)
  query = includes(:tags)
  tags.each do |tag|
    query = query.where("lower(tags.name) = ?", tag)
  end
  return query
end

这会导致 query... WHERE (lower(tags.name) = 'tag1') AND (lower(tags.name) = 'tag2')不匹配任何内容。

我也尝试过使用.where('tags.name IN (?)', tags),但我认为它匹配包含标签之一的任何帖子,而不是包含所有标签的帖子。

现在我在想也许我应该使用标签的 ID,但这听起来可能会导致多个查询。这是低效的吗?

... WHERE tag_id IN (SELECT id FROM tag WHERE name IN ('tag1','tag2'))

搜索多个标签的最佳方法是什么?
(我更愿意理解语法并手动完成,而不是使用 gem,因为我是 Rails 新手。)

4

1 回答 1

0

我最终使用了以下内容:

scope :has_tags, lambda { |tags| includes(:tags)
  .where("lower(tags.name) IN (?)", tags.collect { |tag| tag.downcase } )
  .group('"posts"."id"')
  .having('COUNT(DISTINCT "tags"."id") = ?', tags.count) }
于 2013-01-29T05:11:16.427 回答