カテゴリー:
Rails
タグ:
 Rails Sql includes each

このエントリーをはてなブックマークに追加
更新日時:
2014年01月26日(日)
作成日時:
2013年12月04日(水)

前の記事 / 次の記事

includesを使うことで関連先のオブジェクトも同時に取得することができる。

class User < ActiveRecord::Base
  has_many: articles
end

class Article < ActiveRecord::Base
  belongs_to :user
end

な時に、コレクションをeachして処理する場合で次のような記述をした場合、
article は繰り返しの度に @articles のキャッシュが再利用されるが、
user は毎回SQLを発行して取得される。

-#haml
- @articles.each do |article|
  %dl
    %dt タイトル
    %dd=article.name
    %dt 作成者
    %dd=article.user.name

これを次のように書くと、
user は一度だけSQLが発行されて一括して取得することができる。

-#haml
- @articles.includes(:user).each do |article|
  %dl
    %dt タイトル
    %dd=article.name
    %dt 作成者
    %dd=article.user.name

発行されるSQLの違いは毎回whereで探しに行くか、最初にinで全部持ってくるかの違い。

注意点

includesするオブジェクトがDBに未保存の場合無視されるので注意。

更に、ネストされたリソースも一度に取得できる。

- @atricles.includes(user: :articles).each do |article|
  %dl
    %dt タイトル
    %dd=article.name
    %dt 作成者
    %dd=article.user.name
    %dt="#{article.user.name}さんの他の記事"
    %dd=render article.user.articles

Railsのこういうところってなんていうかキモ気持ちいい。
変態過ぎて尊敬に値するみたいな。