2010/01/27

include と include で select を使う方法

Invoice(請求書) というテーブルに customer (顧客)が紐づいている場合、たいてい請求書と一緒に顧客名も表示する必要があります。
<% for invoice in @invoices %>
  <%= invoice.price %> <%= invoice.customer.name %>
<% end %>
のように。でも、この場合、invoice の数 + 1 のsql 文が発生するので無駄が多い。
そんなときは、関連テーブルも include するべし。
@invoices = Invoice.find(:all, :conditions => {..}, :include => :customer)
さらに、include したテーブルの一部しか使わない場合、:select も使いたいが、なぜか標準では、:inlcude したテーブルに :select が使えない。
@invoices = Invoice.find(:all, :conditions => {..}, :include => :customer, :select => 'customers.name, customer.id')
なんてできるといいのに。。。

これを可能にする pluging が Snow Giraffe の Eager loading select plugin. Rails 2.3 まで対応。

0 件のコメント: