Стремительная загрузка существующих объектов - PullRequest
4 голосов
/ 27 января 2011

В рельсах вы можете создавать ассоциации при загрузке, когда создаете новый объект, подобный этому:

@person = Person.find(params[:id], :include => {:flights => :plane})

Однако у меня иногда уже есть объект @person, и я хочу загрузить ассоциации. Кажется, нет никакого способа «рельсов» сделать это. Я ищу что-то вроде этого в основном:

@person = Person.find(params[:id])
...
@person.include({:flights => :plane})

Фон, у меня есть фильтр до, который уже создает @object без ассоциаций. Но в некоторых действиях, если я не хочу загружать ассоциации, я буду генерировать много единичных запросов. И делает

@person = Person.find(params[:id])
...
@person = Person.find(params[:id], :include => {:flights => :plane})

выглядит как пустая трата времени.

Ответы [ 2 ]

5 голосов
/ 27 января 2011

В Rails 2 вы можете использовать scoped для создания соответствующего запроса:

 @person.flights.scoped(:include => :plane)

В Rails 3 вы можете сделать это в Rails 3 Way:

 @person.flights.include(:plane)

Возможно, вы захотите добавить опцию :include в вашу декларацию has_many, чтобы она была включена по умолчанию при загрузке из Person:

 has_many :flights, :include => :plane

Вы можете альтернативно добавить область по умолчанию в Flight, вызывая любой запрос на Flightвключить его плоскость:

 default_scope :include => :plane
0 голосов
/ 27 января 2011

Просто используйте @person.flights и установите default_scope на рейсах, чтобы включить самолет.
Или в вашей модели Person: has_many :flights, :include => plane

Вы должны переключиться на Rails3, проверить АктивенЗапишите запросы в Rails 3 , чтобы понять почему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...