タグによるSO検索と同等のものが必要なので、exists
クエリが必要ですが、すべてのタグで左結合も必要です。私はいくつかのアプローチを試しましたが、アイデアがありません。
Qustion - タグの関係はhas_and_belongs_to_many
双方向です (つまり、QuestionTags ジョイナー テーブルがあります)。
例えば
Question.join(:tags).where('tag.name = ?', tag_name).includes(:tags)
これで必要なことはできると思いますが、実際には と をマッシュアップするだけincludes
でjoin
、基本的に内部結合になってしまいます。
Question.includes(:tags)
.where("exists (
select 1 from questions_tags
where question_id = questions.id
and tag_id = (select id
from tags
where tags.name = ?))", tag_name)
これは正しい結果を取得しますが、a) 本当に醜く、b) と を混同しているように見えるため、非推奨の警告が表示されincludes
ますjoin
。
非推奨警告: 文字列 SQL スニペットで参照されているテーブル (質問、タグのいずれか) を積極的にロードしているようです。例えば:
Post.includes(:comments).where("comments.title = 'foo'")
これらを名前付きスコープとして記述しようとしていることに注意してください。
質問が明確でない場合はお知らせください。前もって感謝します。