出于这个问题的目的,假设我正在构建 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 新手。)