Да, есть более элегантный способ сделать это. Вы можете загрузить результаты. Позвольте мне показать вам.
без фильтрации списка лиц
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)