Rails Ассоциации через несколько уровней - PullRequest
3 голосов
/ 27 февраля 2011

Я относительно новичок в Rails и работаю над проектом, включающим несколько «вложенных» уровней данных. У меня проблемы с созданием правильных ассоциаций, чтобы я мог получить все дочерние элементы модели на 3 уровня выше. Вот пример моделей:

class Country < ActiveRecord::Base
  has_many :states
end

class State < ActiveRecord::Base
  belongs_to :country
  has_many :cities
end

class City < ActiveRecord::Base
  belongs_to :state
  has_many :people
end

class Person < ActiveRecord::Base
  belongs_to :city
end

Я реализовал связь в модели Country, has_many :cities, :through => :states и попытался вызвать Country.first.cities.all, которая работает. Однако у меня возникают проблемы с доступом ко всем людям в данной стране, когда я пытаюсь Country.first.cities.all.people.all в People контроллере.

Каков наилучший способ справиться с такой ситуацией ассоциации? Должен ли я добавить внешний ключ к каждой из дочерних таблиц, например country_id, чтобы я мог получить все People в Country? Любые предложения будут оценены.

Ответы [ 2 ]

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

Причина в том, что Country.first.cities.all является массивом, и у каждого из его элементов есть метод people вместо всей коллекции городов.Вы заметите, что это работает:

Country.first.cities.first.people.all

Поскольку в первом городе первой страны используется метод людей.Чтобы получить список всех людей в стране, вы можете сделать следующее в одном запросе:

People.joins(:city => {:state => :country})
  .where(:country => {:id => Country.first.id}).all
2 голосов
/ 27 февраля 2011

Это beacouse

Country.first.cities.all

- это коллекция городов, в которой нет метода людей.

Вы должны использовать

Country.first.cities.all.each do |city|
    city.people
end
...