我的模特:
class Person
has_many :projects
class Project
belongs_to :person
has_many :tasks
class Task
belongs_to :project
如果有person
个实例person = Person.find(10)
,是否可以轻松访问属于tasks
的所有projects
的所有person
?另外,如果projects
类似,我还需要进一步过滤projects.duration < x days
结果。我可以尝试通过person.projects
手动构造结果集,然后循环遍历每个project
以获取关联的tasks
,但我希望有另一种更简单更优雅的语法,我不是意识到。顺便说一句,person.projects.tasks
不起作用。
答案 0 :(得分: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)