2017-02-03 9 views
0

RoRで多対多の関係(has_many through:)に関する簡単な質問があります。だから私は多くのTagとその逆を持っているTweetモデルを持っています。Railsでクエリをフィルタリングするhas_many〜

あなたはタグですべてのつぶやきを表示するインデックスアクションとビューを持っていますが、タグによるフィルタリングもあります。 Tweetにはタグが付いていないという少しの詳細もあります。

は、だから私はこのような何かを行う場合:あなたはその後、フィルタする場合

Tweet.includes(:tags).where(tags: { name: #2017 })

は、あなたがTweetにあった、すべてのタグを使用すると、フィルタ処理することを、タグのみを取得しますが、ありませんよ。 F.e. Tweetにタグ#2017, #2016, #2015がある場合、最後には#2017のみ表示されます。

だから、このような何かをやって問題を解決することができます

Tweet.joins(:tags).where(tags: { name: #2017 })

は、その後、あなたがすべてのつぶやきのためにすべてのタグを取得します。

しかし、インデックスページにフィルタがない場合は、すべてのツイートが表示され、タグのないイベントが表示されます。

もちろん、タグのパラメータが存在するかどうかをチェックするようなハックを行うことができます。Tweet.joins else do Tweet.includes

1つのクエリ内でこれを行う方法はありますか?これの背後にある仕組みはなんですか?私はwhereクエリのようなものを持っているときに、のロジックを理解しています。それは中間テーブルにtweet_idと 'tag_id'だけをマップしてからこのIDをTagテーブルにマップするからです。しかし、なぜINNER JOINでそれは私にすべてのタグを与え続けている、私に質問を与える。

ありがとうございます。

答えて

1

そのincludesは熱心なロードを行いますので、あなたが

Tweet.includes(:tags).where(tags: {name: "2017"}) 

を照会するとき、それは熱心な負荷2017 Tweet.tagsなどのタグ名を持つすべてのツイートは再びDBクエリを実行しませんし、タグの一つの値だけを持つことになります。

しかし、それは中わたに参加し、タグとタグ名を持つのみのつぶやきを見つけるん

Tweet.joins(:tags).where(tags: {name: "2017"}) 

に参加した場合には、あなたがTweet.tagsを行う際につぶやきを見つけた後2017年で、それはDBクエリを実行します再びあなたに望みの結果を与えるすべての関連タグを見つける。

関連する問題