以下の様なテーブル構成を考えます。
- articlesテーブル
- articles_tagsテーブル(中間テーブル)
- tagsテーブル
articlesは記事を、tagsは記事につけるタグを表すテーブルです。
説明を簡単にするため、articlesはそれぞれ必ず3つのtagsと紐付いているとします。
記事一覧画面を実装するとします。
以下の様な、記事のタイトルとそのタグが並んで表示されるような画面です。
記事タイトル
タグ: 技術、Rails、小ネタ
この記事一覧でタグで絞り込みができるとします。
例えばtagsのid: 1(技術)で絞り込むことができるとします。
そのときは
Article.includes(:tags).where(tags: {id: 1})
このような方法で取得すると、取得自体はうまくいきますが、表示側は
記事タイトル
タグ: 技術
となって、他のタグ2つが表示されません。
includesの結果がオブジェクトとしてキャッシュされているので当然なのですが、ここをスマートに表示させる方法はないでしょうか?
joinsを使うとキャッシュされないのでうまくいきますが、N+1問題が起きてしまいます。
- SQLの発行数が出来るだけ少ない
- N+1問題が発生しない
- 記事は絞り込んだ数だけ表示されるが、その後のタグは全部表示したい
を満たすようないい方法があれば教えていただきたいです。
あなたの回答
tips
プレビュー