2012-01-15 19 views
4

マイモデルを記録しますRailsの子供の3人のActiveRecordの子供たちは

personインスタンスを考える
class Person 
has_many :projects 

class Project 
belongs_to :person 
has_many :tasks 

class Task 
belongs_to :project 

person = Person.find(10)personのためにすべてのprojectsに属しているすべてのtasksにアクセスするための簡単な方法はありますか?さらに、私はさらにprojectsの結果をフィルタリングする必要があります。projects.duration < x daysのようなものがあれば。私は手作業で結果セットをperson.projectsで作成してから、それぞれprojectをループして、tasksを取得しようとしましたが、私が気づいていない別の簡単で洗練された構文があることを期待しています。 BTW、person.projects.tasksは機能しません。

+1

デュードを、完璧なansweで同様の質問がありますrあなたの質問に。 [Ruby-on-rails-simple-way-to-select-all-of-nested-model](http://stackoverflow.com/questions/2441357/ruby-on-rails-simpleway-すべて選択するすべてのレコードのネストされたモデル) –

答えて

9

はい、もっとエレガントな方法があります。結果を熱心に読み込むことができます。披露させて。人物リスト

person = Person.find(10).includes(:projects=>:tasks) 

にこの意志熱心な負荷をフィルタリングせずに

あなたの結果、あなたが person.projects.first.tasks.firstを呼び出す場合ので、そのすでにロードされ、それ以上のSQLクエリが実行されません。

あなたは彼らがこのような何かフィルタリングしたい場合:あなたはあなたのような関係を設定する必要がプロジェクトを反復処理することなく、すべてのタスクにだけ反復処理したい場合は

person = Person.where('people.id=10 AND projects.duration < ?', x).includes(:projects=>:tasks) 

を:彼らが何かやる反復する

class Person 
    has_many :projects 
    has_many :tasks, :through=>:projects 
end 

person = Person.find(10) 
person.tasks.where('projects.duration < ?', x) 
関連する問題