继承和多态性在轨道上的红宝石中相互冲突

Art*_*hur 0 ruby polymorphism inheritance ruby-on-rails

我在Ruby on Rails上遇到了问题.我有几个继承自同一个类的模型类,以便具有一些通用行为.

父类称为CachedElement.其中一个孩子叫做结果.

我想要一个名为Flow的其他模型属于CachedElement的任何子项.因此,Flow具有称为元素的多态属性,它属于该元素

当我创建一个属于Outcome的新流时,element_type被设置为"CachedElement",它是父类,而不是"Outcome".

这很令人困惑,因为我有几种类型的CachedElement存储在不同的表中,element_id引用了几个不同的元素.

简而言之,我希望element_type字段引用子类名而不是父类名.

我怎样才能做到这一点 ?

mol*_*olf 5

该字段element_type设置为父类,因为ActiveRecord期望您在从其他模型派生时使用单表继承.该字段将引用基类,因为它引用了每个实例存储在其中的表.

如果子项CachedElement存储在自己的表中,则使用Ruby模块替换继承的使用可能更有帮助.在类之间共享逻辑的标准方法是使用混合而不是继承.例如:

module Cacheable
  # methods that should be available for all cached models
  # ...
end

class Outcome < ActiveRecord::Base
  include Cacheable
  # ... 
end
Run Code Online (Sandbox Code Playgroud)

您现在可以轻松地使用多态关联,并且已经element_type设置为正确的类.