【问题标题】:rails - Polymorphic Association or Single-Table Inheritancerails - 多态关联或单表继承
【发布时间】:2013-12-10 01:12:25
【问题描述】:

我在 STI、多态关联或类型表之间纠结。我已经有一个包含以下字段的单位表:

name
account_id
speed_limit
is_speeding
activation_state
unit_status_id

实际上有三种不同的单位:gps 单位、油单位和冰箱单位。当用户登录时,他们的网页会根据它的单位有条件地改变。这三个单元都有一个帐户、activation_state 和 unit_status_id 等字段。但只有 gps 单元有 speeding_limit 或 is_speeding 字段。

我应该使用多态关联吗:

class Unit
  belongs_to :unitable, :polymorphic => true 
end

class RefrigeratorUnit < ActiveRecord::Base
  has_one :units, as: => :unitable
end

class OilUnit < ActiveRecord::Base
  has_one :units, as: => :unitable
end

class GpsUnit < ActiveRecord::Base
  has_one :units, as: => :unitable
end

还是应该使用单表继承?

class Unit < ActiveRecord::Base
end

class GpsUnit < Unit
end

class RefrigeratorUnit < Unit
end

class OilUnit < Unit
end

最初我倾向于 STI,但冰箱和机油单元没有速度限制,这意味着它们将始终为空值。所以我开始实现多态关联,但后来意识到 GPS 单元、机油单元或冰箱单元永远不会 has_many 单位。换句话说,它始终是一个 has_one 关系,例如,当用户创建一个 gps 单元时,也会创建一个单元。这似乎有点多余。所以我很伤心。

【问题讨论】:

    标签: ruby-on-rails polymorphic-associations sti


    【解决方案1】:

    我会说你倒过来了 - 有三种截然不同的单位类型,所以可能应该有三种不同的单位类 - GpsUnit、OilUnit、FridgeUnit。

    然后取决于 - 如果配置文件只有一个单元,那么配置文件:

     belongs_to :unit, :polymorphic => true
    

    如果一个配置文件可以有很多单元,或者单元有很多共同行为,那么 STI 可能就是答案。

    【讨论】:

    • 真的没有“个人资料”。那只是糟糕的命名。真的有 GpsUnit、OilUnit 和 RefrigeratorUnit。为什么你更喜欢 STI 而不是多态关联?这真的是我的问题。
    • 我其实没有,只是我无法完全理解这里的模型。
    • 我编辑了我的问题。没有个人资料。我完全删除了个人资料的任何引用。这里只有三个对象:gpsunit、refrigeraterunit 和 oilunit。它们的大部分属性是相同的。但是,gpsunit 具有其他人没有的超速属性。我认为多态关联更灵活,因为它允许您使用自己的列创建不同的表。但是,当用户创建一个单位时,我将不得不在单位表和 gpsunits 表中插入一条记录,例如,这似乎没有必要。所以这就是我考虑 STI 的原因。
    • 我真的在考虑 STI,因为这三个单元有很多相似之处:它们都属于一个帐户,它们都有激活状态,它们都有报告。
    • 在你的情况下,我可能会去多态,有一个通用的 Unit 类,它 belongs_to :sensor_unit, :polymorphic => true 这是一个很好的入门:eewang.github.io/blog/2013/03/12/… 基本上,如果数据是相同,但行为不同,您想使用 STI(将不同的对象存储在一个表中)。在你的情况下,你有相似的对象但不同的数据,所以是多态的。
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多