Rails 3 activerecord儿童记录

时间:2012-01-15 17:12:39

标签: ruby-on-rails ruby-on-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的所有projects的所有person?另外,如果projects类似,我还需要进一步过滤projects.duration < x days结果。我可以尝试通过person.projects手动构造结果集,然后循环遍历每个project以获取关联的tasks,但我希望有另一种更简单更优雅的语法,我不是意识到。顺便说一句,person.projects.tasks不起作用。

1 个答案:

答案 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)