我在rails应用程序中使用单表继承,并希望显式设置实例的类型.
我有以下几点;
class Event < ActiveRecord::Base class SpecialEvent < Event
这是通过单表继承实现的.
SpecialEvent.new
按预期工作,但我希望能够做到这样的事情
Event.new(:type => 'SpecialEvent')
所以我可以在应用程序中轻松创建不同的子类型.
然而,这并不工作,似乎设置:type
到nil
,没有价值我将其设置为; 我怀疑这是因为通过调用Event.new
它会覆盖:type
参数.
有没有人有这样做的好方法?
如果您尝试动态实例化子类型,并且您将类型作为字符串,则可以执行以下操作:
'SpecialEvent'.constantize.new()
来自"实用 - 使用rails第3版的敏捷Web开发",第380页
还有一个不太明显的约束(使用STI).属性类型也是内置Ruby方法的名称,因此直接访问它以设置或更改行的类型可能会导致奇怪的Ruby消息.相反,通过创建适当类的对象来隐式访问它,或者通过模型对象的索引接口访问它,使用如下所示的东西:
人[:type] ='经理'
伙计,这本书真的很棒
不,我想创建子类型的实例,我想以编程方式确定它们是哪个子类型--HermanD
你可以使用工厂模式,虽然我最近听说人们对过度使用这种模式感到不满.基本上,使用工厂来创建您想要获得的实际类型
class EventFactory def EventFactory.create_event(event_type) event_type.constantize.new() end end