我想做的是为我的一些模型创建一个基类,它具有一些默认的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基类不需要表。它只是用于额外的行为,并像往常一样将其他子类放在自己的表中。
谢谢,克雷格
发布于 2010-08-21 02:30:36
看起来像是您所包含的模块的案例。
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/
发布于 2010-08-21 04:07:34
您需要的是一个抽象类:
class Option < ActiveRecord::Base
self.abstract_class = true
end
class ColorOption < Option
...
end
class FabricOption < Option
...
end
发布于 2013-07-19 20:08:39
我也有类似的问题,但我也想改变AR为我的模型设置table_name的方式,例如MyProject模型将具有表名为"MY_PROJECT“。
正如@FFrançois所说,我通过创建抽象AR类和继承方法实现了这一点,其中我更改了表名,如下所示:
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 :)
https://stackoverflow.com/questions/3532985
复制相似问题