0

タグによるSO検索と同等のものが必要なので、existsクエリが必要ですが、すべてのタグで左結合も必要です。私はいくつかのアプローチを試しましたが、アイデアがありません。

Qustion - タグの関係はhas_and_belongs_to_many双方向です (つまり、QuestionTags ジョイナー テーブルがあります)。

例えば

Question.join(:tags).where('tag.name = ?', tag_name).includes(:tags)

これで必要なことはできると思いますが、実際には と をマッシュアップするだけincludesjoin、基本的に内部結合になってしまいます。

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'")

これらを名前付きスコープとして記述しようとしていることに注意してください。

質問が明確でない場合はお知らせください。前もって感謝します。

4

2 に答える 2

0

preloadの代わりに使用includes:

Question.preload(:tags).where("exists ....

于 2014-03-11T13:34:38.537 に答える