Rails 3.1没有表继承的模型继承

时间:2011-12-01 20:57:02

标签: ruby-on-rails ruby-on-rails-3.1

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

我问的是一个稍微不同的问题。我有一个超类,称之为EntityEntity有一个object_type字段,描述我们拥有的Entity类型。所有类型都具有相同的字段,但每种类型的行为略有不同。例如,add方法对于不同的Entity类型是不同的。

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

如果没有表继承,我将如何进行模型继承,以便url,路径,表单和其他所有内容仍然按照描述工作?也许我有办法避免打电话给.becomes(..)?我正在做的事非常难看;)。

1 个答案:

答案 0 :(得分:1)

我已经了解了有关Ruby和Rails的更多信息,并且我提出了一个很好的解决方案。我将Entity<Type>类更改为模块并将它们放在lib/中。然后,在Entity类中,我有一个after_initialize回调,如下所示:

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

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