0

この質問の目的のために、スタック オーバーフローを構築していると仮定しましょう。

と の関連付けテーブルを介して多対多の関係を持って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 を使用するよりも手動で実行したいと思います。)

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 に答える