Ruby on rails 通过多个级别跟踪关联
我对Rails比较陌生,正在从事一个涉及多个“嵌套”数据级别的项目。我在进行适当的关联时遇到问题,因此我可以将模型3级别的所有子元素都提高。以下是一个模型示例:Ruby on rails 通过多个级别跟踪关联,ruby-on-rails,model,associations,hierarchy,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 < ActiveRec
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
class Country
我已经在国家
模型中实现了一种关系,有许多:城市,:通过=>:州
,并尝试调用国家。第一。城市。所有
,这是有效的。但是,当我尝试在人员
控制器中访问country.first.cities.all.people.all时,访问给定国家/地区的所有人员时遇到问题
处理这种关联情况的最佳方法是什么?我是否应该为每个子表添加外键,例如country\u id
,以便获取国家的所有人员
?如有任何建议,将不胜感激。非常感谢
Country.first.cities.all
是一个城市的集合,它没有人的方法
你应该和我一起去
Country.first.cities.all.each do |city|
city.people
end
原因是Country.first.cities.all是一个数组,它的每个元素都有人的方法,而不是整个城市集合。您会注意到这是有效的:
Country.first.cities.first.people.all
因为第一个国家的第一个城市有人民方法。要获取一个国家所有人的列表,您可以在一个查询中执行以下操作:
People.joins(:city => {:state => :country})
.where(:country => {:id => Country.first.id}).all
您可以使用命名的_范围或范围(在Rails 3中)。也有一个很好的railscast!。这个答案可能很古老,但它帮助我了解了(3和4)嵌套联接的工作原理,我尝试反向操作,当然,如果不起作用的话。现在更容易理解了!谢谢