Получить все имеет много из хеша activerecord - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть модель Campain , в которой есть много Media .

Я делаю это:

Campain.all.medias

Но получаю эту ошибку:

 undefined method `medias' for #<Array:0x00000004bbaf40>

Как я могу получить все носители от Campain.all?

Ответы [ 4 ]

4 голосов
/ 16 ноября 2011

Лучше всего использовать этот код:

Campaign.includes(:media).map(&:media)

(используется английская грамматика, надеюсь, вы поняли основную идею). Это получит все в двух запросах.

--- EDIT ---

Если media - это has_many ассоциация, то возвращаемое значение будет иметь вид: [[...],[..]], поэтому в этом случае используйте flaten, чтобы сделать его простым массивом. В случае, когда нужны все Medium для всех Camplaign, используйте метод массивов group для сбора уникальных или просто простых uniq. Такой подход к использованию классов Rails предпочтителен, так как он более общий и настраиваемый, например, он будет применять любые области по умолчанию, которые могут быть на Campaign.

0 голосов
/ 16 ноября 2011

Если вы ищете все мультимедиа, с которым связана Campaign, вам следует запрашивать через объект Media, а не объект Campaign. Это даст вам один массив объектов Media и займет только один запрос (при условии, что ваш объект Media имеет campaign_id [то есть Media :belongs_to :campaign]).

Media.where("campaign_id is not null").all
0 голосов
/ 16 ноября 2011

Просто для завершения Dylans Post - сегодня я обновился до Rails 3.1.1. Мое приложение имеет ~ 60 моделей, и одна из них называлась Media, и она хорошо работала, когда была плохой английский. Поэтому я обновился и думаю, что они исправили метод pluralize. Я не смог вызвать действия medias, и рельсы сказали, что таблица 'media' не существует, и в тот момент я понял, что моя таблица называется media, потому что я использовал rails 3.0.3 для создания модели. Я переименовал модель, контроллер и названия представлений, обновил маршруты с resources :medias до ressources :media как быстрое исправление, и оно снова заработало!

0 голосов
/ 16 ноября 2011

Что касается Rails, единственное число Media - это «средний», а множественное число - «media», поэтому просто попробуйте media. Однако all все равно вернет массив, который вы все равно не можете вызвать media. Так что вы, вероятно, хотите:

@campaigns = Campaign.all
@media = Medium.where(:campaign_id => @campaigns.collect(&:id))

или это (похоже на другой ответ, но вам нужно сгладить результаты):

Campaign.includes(:media).map(&:media).flatten
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...