我认为我要完成的是多表继承,但我不确定如何正确实现它。
我想从基类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
我认为我有计划的方式是可行的,但我认为有些实施不正确。我很感激任何帮助熨平这方面的细节。谢谢!
答案 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的缺点是最终会得到一个包含继承树的所有列的表。