2011-12-01 68 views
0

我见过的大多数继承问题都假设子类具有与超类不同的属性。例如,Person可能是超级类,而Driver是子类,其中Driver已包含所有内容Person加上了license_type字段。Rails 3.1没有表继承的模型继承

我在问一个稍微不同的问题。我有一个超类,叫它Entity,并且Entity有一个object_type字段,描述我们有什么类型的Entity。所有类型都具有相同的字段,但每种类型的行为稍有不同。例如,对于不同的Entity类型,add方法是不同的。

我目前的解决方案是子类Entity每当我取一个Entity(例如,在find()where(..)),我请entity = entity.becomes(eval("Entity#{entity.object_type}"))。这很难看,并且效果不好,例如url_forform_for将调用未定义的方法,因为类类型为Entity<Type>,而不是Entity

我该如何去做一个没有表继承的模型继承,例如url,路径,表单和其他所有东西仍然按照描述工作?也许有一种方法可以让我避免拨打.becomes(..)?我所做的很丑陋;)。

回答

1

我已经了解了更多关于Ruby和Rails的知识,并且我提出了一个很好的解决方案。我将Entity<Type>类更改为模块,并将它们放入lib/。然后,在实体类中,我有一个after_initialize回调,看起来像这样:

if object_type == "Type1" 
    extend EntityType1 
elsif object_type == "Type2" 
    extend EntityType2 
end 

这样,在EntityType1EntityType2定义的所有方法中Entity类的范围执行,而不需要任何新的类实例。到目前为止,解决方案一直运行良好,尽管我现在只用了几天。