我有一个父对象Post,它有以下孩子。
has_one :link
has_one :picture
has_one :code
这些孩子是互相排斥的。
有没有办法反向使用多态关联,这样我的Post表中就不必有link_id,picture_id和code_id字段了?
答案 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_id
,picture_id
和code_id
。我想你想说belongs_to
。
我想做点什么 @ post.postable并得到孩子 对象,这将是链接之一, 图片或代码。
我相信您可以通过使用STI并组合links
,pictures
和codes
表来执行此操作,然后在检索时测试模型的类型。但这看起来很糟糕,最终可能会有很多未使用的列。
除了节省空间之外,是否有理由不存储未使用的id列?如果您愿意保留它们,那么您可以定义虚拟属性和postable_type
列:(未经测试的代码,可能会失败)
def postable
self.send(self.postable_type)
end
def postable=(p)
self.send(postable_type.to_s+"=",p)
end