2010-08-15 104 views
5

我有一个父对象Post,它有以下子对象。反向多态性关联

has_one :link 
has_one :picture 
has_one :code 

这些孩子是相互排斥的。

是否有反向使用多态关联的方法,以便我不必在Post表中使用link_id,picture_id和code_id字段?

+0

让照片有has_many关系有意义吗? 然后,你可以做你正在寻找.. – Trip 2010-08-15 15:32:23

回答

0

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

当一切都失败了,阅读文档:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

+0

也许我错过了一些东西,但我将如何创建一个动态的关联与小孩使用:as? 我了解多态关于如何子对象可以有任何类型的父对象。但是我问的是父对象如何可以有任何类型的子对象。 我想做一些类似于@ post.postable的东西,并获取子对象,这将是链接,图片或代码之一。 – 2010-08-15 22:25:51

0

有没有办法使用反向多态性 协会让我 不必有link_id, picture_id和code_id领域的方式我的 邮政表?

has_one意味着外键是在其他表。如果你真的以这种方式定义你的模型,那么你的Post表中就不会有link_id,picture_idcode_id。我想你的意思是说belongs_to

我要像做 @ post.postable并得到孩子 对象,这将是环节之一, 图片或代码。

我相信你可以使用STI和结合linkspicturescodes表,然后检索时测试模型的类型,做到这一点。这似乎kludgey虽然,并可能结束了大量未使用的列。

是否有没有存储未使用的id列,而不是节省空间的原因?如果你愿意让他们,那么你可以定义一个虚拟属性和postable_type柱:(未经测试的代码,可壮观失败)

def postable 
    self.send(self.postable_type) 
end 

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

我只是寻找一种比多个* _id列更优雅的方式。虽然当这个线程被证明,多个* _id列方法可能是最简单和最好的。 – 2010-08-20 16:34:06