Rails
Gem
acts-as-taggable-on

acts-as-taggable-onを使ってtag機能を作成したときに大量のN+1が発生するやーつ

やったこと

*具体的な使い方などは割愛します。適宜リファレンスなどを参照してください。

なにがおきたか

  • 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が変化するようだ。
これがライブラリーの怖さでもある