0

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

我想从一个Device包含所有常见字段(例如名称和启用)的基类开始。

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

然后我想为不同的设备类型创建抽象类,例如Light继承自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

我的目标是像下面这样使用它

light1 = X10Light.new
light1.serial_number = "x1"
light1.save

light2 = ZWaveLight.new
light2.serial_number = "z1"
light2.save

all_lights = Light.all
all_lights.each do |light|
  light.off
end

我认为我计划事情的方式是可能的,但我认为有些实施不正确。我将不胜感激任何帮助解决这方面的细节。谢谢!

4

1 回答 1

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 的缺点是您最终会得到一个包含继承树的所有列的表。

于 2013-04-20T17:20:42.330 回答