我有以下课程:
class Region < ActiveRecord::Base
has_many :geographical_relations, :as => :contained
has_many :geographical_units, :as => :container, :class_name => "GeographicalRelation"
end
class GeographicalRelation < ActiveRecord::Base
belongs_to :container, :polymorphic => true
belongs_to :contained, :polymorphic => true
end
class Country < ActiveRecord::Base
has_many :geographical_relations, :as => :contained
end
我希望能够从国家/地区记录中获取所有包含它的区域:
c = Country.find(1)
c.regions #=> should return all the regions in which c is contained
现在我已经创建了以下方法:
def regions
self.geographical_relations.where(:container_type => "Region").map{|relation| relation.container}
end
但我想知道是否有办法设置“has_many”关联来为我做这件事。
干杯。
修改
在尝试评论中建议的备选方案后,我只得到了很好的ActiveRecord错误。
has_many_polymorphs gem似乎是一个很好的方法,但是对于Rails 3,它并没有“正式”支持,所以对我来说这不是一个好的选择。
因此,我将使用上述方法,将它们放在模块中,并在每个“容器”/“包含”模型中包含相应的模块。这似乎工作正常。 =)只改变我做的,以避免N + 1查询添加'包含':
def regions
self.geographical_relations.includes(:container).where(:container_type => "Region").map{|relation| relation.container}
end
希望这可以很好地运行... = P =)
无论如何,如果有人有解决这个问题的答案我会期待看到它! =)
全部谢谢!