My models:
class Person
has_many :projects
class Project
belongs_to :person
has_many :tasks
class Task
belongs_to :project
Given a person
instance, person = Person.find(10)
, is there an easy way to access all the tasks
that belongs to all the projects
for the person
? In addition, I would need to further filter the projects
results if projects.duration < x days
sort of thing. I could try to manually construct the resultset by person.projects
and then looping through each project
to get the associated tasks
but I'm hoping there is another simpler more elegant syntax that I'm not aware of. BTW, person.projects.tasks
doesn't work.
Yes, there is a more elegant way to do it. You can eager load the results. Let me show you.
without filtering the person list
person = Person.find(10).includes(:projects=>:tasks)
This will eager load you the results so if you call person.projects.first.tasks.first
its already loaded and no more sql queries will be executed.
If you'd like to filter them do something like this:
person = Person.where('people.id=10 AND projects.duration < ?', x).includes(:projects=>:tasks)
If you'd like to iterate just on all the tasks without iterating through the projects you have to set up a relation like:
class Person
has_many :projects
has_many :tasks, :through=>:projects
end
To iterate them do something like:
person = Person.find(10)
person.tasks.where('projects.duration < ?', x)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With