2012-01-15 44 views
4

我的模型:的Rails 3個孩子的ActiveRecord的孩子記錄

class Person 
has_many :projects 

class Project 
belongs_to :person 
has_many :tasks 

class Task 
belongs_to :project 

給定一個person實例,person = Person.find(10),有一個簡單的方法來訪問所有tasks屬於所有projectsperson?此外,我需要進一步過濾projects結果,如果projects.duration < x days種事情。我可以嘗試通過person.projects手動構建結果集,然後循環遍歷每個project以獲得關聯的tasks,但是我希望還有另一個更簡單更優雅的語法,我不知道。順便說一句,person.projects.tasks不起作用。

+1

哥們,有一個完美的answe類似的問題回答你的問題。 [的Ruby-on-Rails的簡單的方式對選擇所有記錄的對的一嵌套模型(http://stackoverflow.com/questions/2441357/ruby-on-rails-simple-way-對選擇所有記錄的對的一嵌套模型) – 2012-01-15 17:29:00

回答

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)