反向多态关联

时间:2010-08-15 14:16:24

标签: ruby-on-rails polymorphism associations

我有一个父对象Post,它有以下孩子。

has_one :link
has_one :picture
has_one :code

这些孩子是互相排斥的。

有没有办法反向使用多态关联,这样我的Post表中就不必有link_id,picture_id和code_id字段了?

3 个答案:

答案 0 :(得分:8)

我写了一篇小小的Gist,展示了如何做到这一点: https://gist.github.com/1242485

答案 1 :(得分:0)

我相信您正在为:as寻找has_one选项。它允许您指定belongs_to关联结束的名称。

当其他所有方法都失败时,请阅读文档:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

答案 2 :(得分:0)

  

有没有办法使用多态   反向的联想让我   不必有link_id,   picture_id和我的code_id字段   邮政表?

has_one表示外键位于其他表中。如果您确实以这种方式定义了模型,那么Post表中就不会有link_idpicture_idcode_id。我想你想说belongs_to

  

我想做点什么   @ post.postable并得到孩子   对象,这将是链接之一,   图片或代码。

我相信您可以通过使用STI并组合linkspicturescodes表来执行此操作,然后在检索时测试模型的类型。但这看起来很糟糕,最终可能会有很多未使用的列。

除了节省空间之外,是否有理由不存储未使用的id列?如果您愿意保留它们,那么您可以定义虚拟属性和postable_type列:(未经测试的代码,可能会失败)

def postable
  self.send(self.postable_type)
end

def postable=(p)
  self.send(postable_type.to_s+"=",p)
end