背景
我有一个rails 3应用程序,其中包含一个名为A
的模型,其中包含对应的表as
。现在我需要一个新模型B
,其工作方式与A
完全相同,但还有其他一些关联和方法(除了A
中的那些)。
问题
我决定使用STI(单表继承)。我知道我可以执行类似A < BaseModel
和B < BaseModel
的操作,但是已经很多代码假设一个名为as
的表,并且需要做太多工作。
所以我正在尝试B < A
,其中A
不是抽象的。我将type
列添加到as
。现在模型B
工作得很完美,但模型A
对继承一无所知,完全忽略了type
列,所以当我A.create!
时,它表示列type
不能为空。此外,A.all
也会返回B
行。
我尝试了什么
A
列的默认值type
。 这可行,但只能解决部分问题 A
模型中的默认范围。 此方法的问题在于它会过滤掉两个模型的所有B
行 问题
B < A
,其中没有一个模型是抽象的?答案 0 :(得分:3)
最简单的解决方案可能是创建一个新的基类,同时A
和B
扩展它。
基类会将其表名设置为指向当前的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
的模型,它将是自包含的。它将包括具有所有属性的表。最后,模型A
和B
将具有与C
模型的多态has_one关系。