1

背景

我有一个 rails 3 应用程序,它有一个以A对应表命名的模型as。现在我需要一个新模型B,它的工作原理与此一模一样,A但有一些其他的关联和方法(除了 中的那些A)。

问题

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

所以我正在尝试做B < A,哪里A不是抽象的。我将该type列添加到as. 现在模型B完美运行,但是模型A对继承一无所知并且完全忽略了该type列,所以当我这样做时,A.create!它说该列type不能为空。也A.all返回B行。

我试过的

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

问题

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

2 回答 2

3

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

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

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

class A < NewBaseClass
  # ...
end

class B < NewBaseClass
  # ...
end
于 2013-01-15T19:19:15.463 回答
0

尝试:

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

另一种方法:

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

于 2013-01-15T14:14:46.360 回答