2007年10月04日

AR#findのincludeオプションの罠

たとえば、こういうモデルがテーブル関係にある場合、


$ cat app/model/user.rb
class User < ActiveRecord::Base
has_one :user_some
end
$ cat app/model/user_some.rb
class UserSome < ActiveRecord::Base
belongs_to :user
end


userモデルとuser_someモデルは1:1対応。



User.find :first


だと


SELECT * FROM users LIMIT 1


と、まぁごく自然なのに対して、


User.find :first, :include => [ :user_profile ]


だと、


SELECT users.`id` AS t0_r0, users.`hoge` AS t0_r1, user_somes.`id` AS t1_r0, user_somes.`hoge` AS t1_r1 FROM users LEFT OUTER JOIN user_profiles ON user_profiles.user_id = users.id


となり、え?って感じで、10000レコードずつあれば、1億レコードのもRailsに返ってきて、それを処理することになる。どっひゃーーって感じなので、注意せねばね。

where
で絞り込めば、まだマシなのでしょうが、そうでない場合もあるので、注意がかなり必要!
ラベル:Rails
posted by N.T.T with Rails 3.2 (ex. 2.1) at 11:00| Comment(0) | TrackBack(0) | Rails | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。