Rails 3 activerecord дочерних записей детей - PullRequest
4 голосов
/ 15 января 2012

Мои модели:

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 Ответ

9 голосов
/ 15 января 2012

Да, есть более элегантный способ сделать это. Вы можете загрузить результаты. Позвольте мне показать вам.

без фильтрации списка лиц

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...