通过多个级别的Rails关联

时间:2011-02-27 17:34:21

标签: ruby-on-rails model associations hierarchy

我对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 个答案:

答案 0 :(得分:5)

原因是Country.first.cities.all是一个数组,它的每个元素都有方法people,而不是整个城市集合。你会发现这有效:

Country.first.cities.first.people.all

因为第一个国家的第一个城市有人民法。要获取一个国家/地区中所有人的列表,您可以在一个查询中执行以下操作:

People.joins(:city => {:state => :country})
  .where(:country => {:id => Country.first.id}).all

答案 1 :(得分:2)

这是beacouse

Country.first.cities.all

是一个城市的集合,它没有人的方法。

你应该选择

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