RailsのActiveRecordのfindメソッドで:includeオプションを使うとき、複数のテーブルをincludeできないかなぁと思って色々と試していたら、配列とハッシュを利用して実現できた。
例えば、顧客が複数のサイトを持っていて、各サイトごとに複数のプロジェクトがあり、各プロジェクトがASPのデータを持っていて、また各プロジェクトに変更イベントがあるとする。
その情報のためのテーブルがあり、
- 1 Client 対 多 Site
- 1 Site 対 多 Project
- 1 Project 対 多 ChangeEvent
- 1 Asp 対 多 Project
という構造になっている。
すると、
ChangeEvent.find(:all).each do |event| p event.project.site.client.name p event.project.site.name p event.project.name p event.project.asp.name end #本当は変数を用いればDBアクセスをもう少し減らすことができるが、今回はそこは焦点ではないので、わかりやすくするためにこう書いてみた。
のようなことを行うとき、DBのアクセス回数が多くなり、実行速度が遅くなってしまう。
こういうとき、以下のようにincludeを使えば、一度のDBアクセスで、必要なデータをとってこれるので、実行速度が速くなる。
※該当テーブルで、project_id, asp_id, site_id, client_idにインデックスを貼っておくとよい。
ChangeEvent.find(:all, :include => [:project => [{:site => :client}, :asp]])
:includeは、配列で複数テーブルのデータをとってくることができ、ハッシュで繋がっているテーブルをとってくることができる。
お読み頂きありがとうございます。
少しでもお役に立てたらクリックお願いします↓。