やったこと
- acts-as-taggable-onを使って、tag機能を実装
*具体的な使い方などは割愛します。適宜リファレンスなどを参照してください。
なにがおきたか
- includeしたはずなのに、viewで呼び出すとsqlが発行され、tagが大量の N+1を発生させる
実際に書いてたコード
postモデル
acts_as_taggable_on
taggingモデル
has_many tags
tagモデル
belong_to tagging
posts_controller
Post.include(tagging: :tag)
view
@post.tags_list
- tags_listはgemの中で定義されているdefalultのメソッド
- tagの名前を配列で返してくれる
=> レコードの数だけ tagが呼ばれてしまう。
解決策
下記のようにコードを変更
posts_controller
Post.include(:tag)
view
@post.tags.pluck(:name).join("<br />").html_safe
どうやら、includeの書き方とメソッドの呼び出し方でsqlが変化するようだ。
これがライブラリーの怖さでもある