Rails:多对多变形关联:获取特定类型的记录

时间:2010-12-16 16:49:40

标签: ruby-on-rails polymorphic-associations

我有以下课程:

 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 =)

无论如何,如果有人有解决这个问题的答案我会期待看到它! =)

全部谢谢!

0 个答案:

没有答案