我想要做的是为我的一些模型设置一个基类,它具有一些默认的activerecord行为:
class Option < ActiveRecord::Base has_many :products def some_method #stuff end #etc..etc.. end class ColorOption < Option #stuff... end class FabricOption < Option #stuff... end
但是,我希望每个ColorOption和FabricOption都在他们自己的表中.我不想使用STI或为基类"Option"设置表.我实现这一点的唯一方法是使用一些非继承元编程魔法.但我想知道是否有办法告诉AR基类不需要表.它只是用于额外行为,并像往常一样将其他子类放在自己的表中.
谢谢,克雷格
你想要的是一个抽象类:
class Option < ActiveRecord::Base self.abstract_class = true end class ColorOption < Option ... end class FabricOption < Option ... end
我在博客上有一些关于STI和#abstract_class的额外信息.
看起来像是您包含的模块的案例.
module Option def self.included(base) base.has_many :products end # other instance methods end class ColorOption < ActiveRecord::Base include Option set_table_name '???' # unless ColorOption / FabricOption have same table -> move to Option module #stuff... end class FabricOption < Option include Option set_table_name '???' # unless ColorOption / FabricOption have same table -> move to Option module #stuff... end
更多信息:http://mediumexposure.com/multiple-table-inheritance-active-record/
我有类似的问题,但我也想改变AR为我的模型设置table_name的方式,例如MyProject模型将具有表名"MY_PROJECT".
我已经通过创建抽象的AR类来实现它,正如@FFrançois所说,并且使用继承的方法,我正在更改表名,如下所示:
class MyModel < ActiveRecord::Base self.abstract_class = true def self.inherited(subclass) subclass.table_name = subclass.name.underscore.upcase end end class MyProject < MyModel end
现在MyProject.table_name给出MY_PROJECT :)