2016-08-03 8 views
0

は私の5つのモデルと関連する団体ですインスタンスに深い関連をeager_load次eager_load:すべてのRailsは以下

  • ユーザーズAnswers
    • の各回答の関連sub_category
      • 関連するquestion
        • 質問の各sub_categories'に関連するsuper_category
01の各

私は次のことを試みた:

@user.eager_load(answers: {question: {sub_category: :super_category}}) 

それが次のエラーで戻ってくるしかし:

NoMethodError ... Undefined method 'eager_load' for the [user record]

私は私が間違っているのかわからないです。

質問:上記のインスタンスへの関連付けをeager_loadするにはどうすればよいですか?

すべてのeager_loadingが実行された時点で、関連するquestionレコードのいずれも永続化されていないので、そのすべてのidsはnilではありません。私はこれが重要だとは思わないが、ただの場合:私はそれを言及すべきであると思った。

+0

'ユーザー:

は次のように試してみてください。( "users.id =?"、1).first'または 'User.eager_load(答え:{question:{sub_category::super_category}}))ここで、eager_load(答え:{質問:{sub_category::super_category}}) .find(1) ' –

答えて

3

N + 1クエリを防止しようとしています。

Preloadは、コレクションごとに個別のSQLクエリを実行します。

1つのクエリですべてのコレクションを取得するために、1つ左に結合されたSELECTを使用します。 includesを使用する場合は、どれを使用するかを選択します。

eager_loadはクラスメソッドです。モデルClassで使用する必要があります。

User.eager_load(answers: {question: {sub_category: :super_category}}).where("users.id = ?",1).first 

または

User.eager_load(answers: {question: {sub_category: :super_category}}).find(1) 
0

Awladが彼のコメントで示唆しているように、eager_loadはインスタンスではなくクラスで呼び出されるべきです。 docsを参照してください。いい仕事、Awlad!

+0

インスタンスをeager_loadするにはどうすればいいですか? – Neil

+0

Awladの答えを参照してください。私は彼があなたをカバーしていると思います。 – jvillian