【问题标题】:Optional relation between two model objects in rails轨道中两个模型对象之间的可选关系
【发布时间】:2016-10-14 07:08:32
【问题描述】:

我的 Rails 模型中有两个对象 A 和 B,它们具有可选的一对一关系。比如说,A 可以有 0 或 1 个 B。在大多数情况下,A 有 0 个 B。

此外,稍后可以在 A 和其他对象 X、Y、Z 之间引入其他此类关系。

鉴于这些是一对一的关系,A 和 B 之间的 has-a 关系是有意义的。但考虑到它是一个可选且不常见的关系,而且其他此类关系可以在稍后与 A 一起引入,为每个新关系添加一个新列似乎是有问题的。

如何更好地模拟这种关系?在这种特殊情况下,使用 A 和 B 之间的相关表是否更有意义?

【问题讨论】:

    标签: mysql ruby-on-rails activerecord


    【解决方案1】:

    您可以将模型 A 的 id 添加到所有其他模型中,模型 A 将为每个模型添加一个。

    彼此都属于_模型A

    【讨论】:

      【解决方案2】:

      我会采用所提供的解决方案,即在A 中添加一个新列b_id

      否则,您可以创建第三个模型 C,它同时包含 a_idb_id,然后让 A 访问 BC

      # Pluralization is off here. Remember to pluralize has_many
      class A < ActiveRecord::Base
        has_many :c
        has_many :b, through: :c
      end
      
      class B < ActiveRecord::Base
        has_many :c
        has_many :a, through: :c
      end
      
      class C < ActiveRecord::Base
        belongs_to :a
        belongs_to :b
      end
      

      这将防止数据库中出现任何空值。这是我在围绕关系构建内容时最常使用的解决方案,因为现在您可以存储有关关系的更多信息。

      您还可以使 C 具有多态性,以便它可以存储任何模型(不仅是 A)。 http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 2019-11-13
        • 1970-01-01
        • 2012-07-18
        相关资源
        最近更新 更多