没有抽象类的Rails STI(单表继承)

时间:2013-01-15 13:34:38

标签: ruby ruby-on-rails-3 sti

背景

我有一个rails 3应用程序,其中包含一个名为A的模型,其中包含对应的表as。现在我需要一个新模型B,其工作方式与A完全相同,但还有其他一些关联和方法(除了A中的那些)。

问题

我决定使用STI(单表继承)。我知道我可以执行类似A < BaseModelB < BaseModel的操作,但是已经很多代码假设一个名为as的表,并且需要做太多工作。

所以我正在尝试B < A,其中A不是抽象的。我将type列添加到as。现在模型B工作得很完美,但模型A对继承一无所知,完全忽略了type列,所以当我A.create!时,它表示列type不能为空。此外,A.all也会返回B行。

我尝试了什么

  • 使用A列的默认值type这可行,但只能解决部分问题
  • 使用A模型中的默认范围。 此方法的问题在于它会过滤掉两个模型的所有B

问题

  • 如何在rails中完成B < A,其中没有一个模型是抽象的?
  • 还有其他不错的选择吗?

2 个答案:

答案 0 :(得分:3)

最简单的解决方案可能是创建一个新的基类,同时AB扩展它。

基类会将其表名设置为指向当前的A表(as):

class NewBaseClass < ActiveRecord::Base
  self.table_name = `as`
end

class A < NewBaseClass
  # ...
end

class B < NewBaseClass
  # ...
end

答案 1 :(得分:0)

尝试:

class A< ActiveRecord::Base
      self.abstract = false
end

另一种方法:

我会创建另一个名为C的模型,它将是自包含的。它将包括具有所有属性的表。最后,模型AB将具有与C模型的多态has_one关系。

相关问题