久保清隆のブログ

ライフハック、健康、旅行など、役立つ情報を書きます。

Railsのfindメソッドのincludeオプションで、複数のテーブルをincludeする方法

RailsActiveRecordの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は、配列で複数テーブルのデータをとってくることができ、ハッシュで繋がっているテーブルをとってくることができる。


お読み頂きありがとうございます。
少しでもお役に立てたらクリックお願いします↓。

にほんブログ村 IT技術ブログ プログラム・プログラマへ人気ブログランキングへ Subscribe with livedoor Reader 


◆◆このブログのサイトマップへ◆◆