Ruby on Rails 3: как получить доступ к атрибуту каждой записи в запросе has_many - PullRequest
4 голосов
/ 01 октября 2011

Я не был уверен, как сформулировать это в заголовке, но я пытаюсь сделать следующее. У меня есть 2 модели, которые имеют следующие отношения:

class Campaign < ActiveRecord::Base
   has_many :points
end

class Point < ActiveRecord::Base
   belongs_to :campaign
end

Теперь модель Point имеет атрибут "locale", и я хочу иметь возможность помещать все "locales" каждой точки определенной кампании в массив, коллекцию или что-либо еще без необходимости делать что-то вроде

locales = Array.new
campaign.points.each do |p|
   locales << p.locale
end

Я думал о чем-то вроде campaign.points.locales. Есть ли какой-нибудь хороший Rails способ выполнить этот запрос, или мне просто нужно перебрать коллекцию?

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: Кроме того, поскольку отношение на самом деле является отношением "has_many through", этот метод не работает, так как я получаю много повторяющихся локалей, если пытаюсь повторить этот простой способ. Похоже, это должно быть какое-то соединение, но я не уверен.

Ответы [ 3 ]

7 голосов
/ 01 октября 2011

Я бы сделал:

campaign.points.map(&:locale)
4 голосов
/ 01 октября 2011
campaign.points.map {|p| p.locale}

должен добиться цели.

1 голос
/ 01 октября 2011

Ты можешь сделать то, что сказали эти парни.Поставьте .uniq в конце их и получите правильное решение, или;

позвольте мне сбить вас с толку ActiveRecord (и, возможно, неудачей, поскольку я не могу проверить, работает ли онВот).Но вы сможете запустить campaign.points.locales так, как вы хотели.

class Campaign < ActiveRecord::Base
  has_many :points do
    def locales
      select('DISTINCT(locale)').map(&:locale)
    end
  end
end
...