2

アプリケーションに次の User モデルがあります (簡略化)

クラス User < ActiveRecord::Base

attr_accessible :username, :email, :password, :company_id, :role_id  
belongs_to :company  
belongs_to :role  

終わり

私の質問は次のとおりです。私のユーザーは、セッション中ずっとすべての Company モデル属性を持ち歩いていますか、それとも user.company が実行されたときだけ持ち歩いていますか?

セッション中に会社のメソッドがリレーションとして存在すると思いますが、よくわかりません。

私のユーザーが実際に Company オブジェクトを持ち歩いている場合、実際に呼び出されたときにのみこれが発生してデータベースクエリを実行するのを防ぐ方法はありますか?

前もって感謝します。

4

2 に答える 2

3

遅延読み込み(デフォルト)は、関連付けメソッドが必要な場合にのみ呼び出されることを意味します。

したがって、ユーザーオブジェクトにはオブジェクトがありますがオブジェクトはありcompany_idませんcompany。user.companyが見つかると、DBクエリが実行されます。

しかし、あなたは方法eager loadでそれをすることができますincludes

users積極的な読み込みは、複数のを読み込む場合に一般的に役立ちます。view繰り返してuser.companyをusers呼び出すと、user.companyの呼び出しごとにDBクエリが実行されます(つまり、毎回同じテーブルに対してdbクエリを実行します)。usersこの積極的な読み込みを回避すると、取得したすべての会社のデータをすべて読み込むことができます。

于 2012-09-22T16:48:38.380 に答える
3

答えは、ユーザー オブジェクトをどのようにインスタンス化したか、および/または関連付けに既にアクセスしているかどうかによって異なります。#loaded を使用できますか? 内省をするために。いくつかの例と、提供されたコードに基づいて期待される結果を次に示します。

user = User.last
user.company.loaded?
=> false
user.company   # loads the association
user.company.loaded?
=> true

user = User.includes(:company).last # eager loads the association
user.company.loaded?
=> true
于 2012-09-22T14:15:47.953 に答える