この質問の目的のために、スタック オーバーフローを構築していると仮定しましょう。
と の関連付けテーブルを介して多対多の関係を持ってPosts
おり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
... WHERE (lower(tags.name) = 'tag1') AND (lower(tags.name) = 'tag2')
これにより、何にも一致しないqueryが生成されます。
も使用してみまし.where('tags.name IN (?)', tags)
たが、すべてのタグを含む投稿ではなく、いずれかのタグを含む投稿に一致すると思います。
タグの ID を使用する必要があるのではないかと考えていますが、複数のクエリが発生する可能性があるようです。これは非効率ですか?
... WHERE tag_id IN (SELECT id FROM tag WHERE name IN ('tag1','tag2'))
複数のタグを検索する最良の方法は何ですか?
(Rails は初めてなので、構文を理解して、gem を使用するよりも手動で実行したいと思います。)