Rails活动模型继承

时间:2013-04-20 16:50:09

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我认为我要完成的是多表继承,但我不确定如何正确实现它。

我想从基类Device开始,它将包含所有常用字段,例如name和enabled。

class Device
  # in app/models
  # Fields
  #   String name
  #   boolean enabled
end

然后,我想为不同的设备类型创建抽象类,例如继承自Light的{​​{1}}

Device

然后,我将为class Light < ActiveRecord:Base # in app/models # Fields # String type include Device def on raise NotImplementedError end def off raise NotImplementedError end end X10Light等特定设备提供类,这些设备将定义每个设备的细节并实现抽象方法。

ZWaveLight

我的目标是使用它,如下所示

class X10Light < Light
  # in app/models
  # Fields
  #   String serial_number

  def on
    # fully implemented on method
  end

  def off
    # fully implemented off method
  end
end

我认为我有计划的方式是可行的,但我认为有些实施不正确。我很感激任何帮助熨平这方面的细节。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用单表继承,您需要创建一个模型Device,它将包含您的所有字段以及一个名为type的保留列,其中rails将存储具体实例的类名

rails g model Device type:string ... other fields (ie columns for device, light, x10light) ...

class Device < ActiveRecord:Base
  ...
end

class Light < Device
  ...
end

class X10Light < Light
  ...
end

使用STI的缺点是最终会得到一个包含继承树的所有列的表。