Rails: загружать при поиске ассоциаций, а не при поиске - PullRequest
1 голос
/ 08 января 2012

У меня есть три вложенных модели: user имеет много plates и plate имеет много fruits.У меня также есть вспомогательный метод current_user, который выполняется в фильтре before для проверки подлинности.Поэтому, когда я добираюсь до своего контроллера, у меня уже есть мой user объект.Как я могу загрузить все пользовательские plates и fruits одновременно?

Другими словами, я хотел бы сделать что-то вроде:

@plates = current_user.plates(include: :fruits)

Как мне этого добиться?

Я использую Rails 3.1.3.

Ответы [ 3 ]

1 голос
/ 08 января 2012

Возможно, вы захотите использовать предоставленный метод #includes в ваших отношениях.НЕ ИСПОЛЬЗУЙТЕ #all, если вы не собираетесь немедленно работать с записями, это сразу же победит многие формы кэширования.

Возможно, что-то вроде: @plates = current_user.plates.includes(:fruits)

К сожалению, есть частиRails API, который не так хорошо документирован, как должен быть.Я бы порекомендовал проверить следующие ресурсы, если у вас есть дополнительные вопросы об интерфейсе запросов Rails:

Интерфейс запросов, возможно, является наиболее сложной частью стека Rails, особенно с изменениями, сделанными в Rails 3.0 и 3.1.

0 голосов
/ 08 января 2012
@plates = current_user.plates.all(:include => :fruits)

должен это сделать.

0 голосов
/ 08 января 2012

Вы можете сделать

ActiveRecord::Associations::Preloader.new([current_user], :plates => :fruit).run

Чтобы загрузить ассоциации после того, как current_user был потерян. Второй аргумент может быть любым, что вы обычно передаете includes: символ, массив символов, хэш и т. Д.

...