n+1

いくつか残っていたn+1問題を解決するために、:includeをごりごり挿入。
以下メモ。
普通のinclude :include => :item
複数include :inluce => [:item, :another, :yetanother]
関連先もinclude :inluce => [{:item => :related_items}, :another]
acts_as_treeを使ってると、:include => :childrenで子ツリーを先読みできた。すばらしい。
(has_manyの時はちゃんと複数形にすること)
注意点として、:throughで中間テーブルを使って、かつ関連先が削除されていた場合、 @item.related_itemsだと削除済みのエントリは読み込まれないけど、Item.find(:all, :include => :related_items)にしてると配列にnilが入ってしまい、関連先の処理をしようとしたところで怒られてしまう。(お約束のnil class発生)
回避するためには中間テーブルに:dependent => :destroyを付けておかないといけないが、不幸にしてやってなかった場合には手でテーブルを編集するか、@item.related_items.compact.eachとかダサいことをしなくてはならない。しょんぼり。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>