【问题标题】:Reverse Polymorphic Associations反向多态关联
【发布时间】:2010-08-15 14:16:23
【问题描述】:

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

has_one :link
has_one :picture
has_one :code

这些孩子是相互排斥的。

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

【问题讨论】:

  • 让照片有 :has_many 关系有意义吗?然后你就可以做你想做的事了..

标签: ruby-on-rails polymorphism associations


【解决方案1】:

我写了一个小要点来展示如何做到这一点: https://gist.github.com/1242485

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 也许我遗漏了一些东西,但是如何使用 :as 创建与孩子的动态关联?我理解关于子对象如何具有任何类型的父对象的多态性。但我要问的是父对象如何拥有任何类型的子对象。我想做类似@post.postable 的事情并获取子对象,它可以是链接、图片或代码之一。
    【解决方案3】:

    有没有办法使用多态 反向关联,使我 不必有link_id, 我的picture_id 和code_id 字段 发布表?

    has_one 表示外键在other 表中。如果您确实以这种方式定义了模型,那么您的 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
    

    【讨论】:

    • 我只是在寻找一种比拥有多个 *_id 列更优雅的做事方式。尽管正如这个线程所证明的那样,多 *_id 列的方法可能是最简单和最好的。
    猜你喜欢
    • 2020-06-20
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多