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

Ruby 没有抽象类的Rails STI(单表继承),ruby,ruby-on-rails-3,sti,Ruby,Ruby On Rails 3,Sti,背景 我有一个rails 3应用程序,它有一个名为a的模型,对应的表为。现在,我需要一个新的模型B,它的工作原理与a完全相同,但有一些其他的关联和方法(除了a中的那些) 问题 我决定使用STI(单表继承)。我知道我可以做像A

背景

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

问题

我决定使用STI(单表继承)。我知道我可以做像
A
B
这样的事情,但是如果将
表命名为
,那么已经有大量的代码了,这将需要太多的工作

所以我试着做
B
,其中
A
不是抽象的。我将
type
列添加到
as
。现在,模型
B
工作得非常完美,但是模型
A
不知道任何关于继承的内容,完全忽略了
类型
列,所以当我创建
A时
表示
type
列不能为空。另外
A.all
也返回
B

我尝试过的

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

  • 我如何在rails中实现
    B
    ,其中没有一个模型是抽象的
  • 还有其他好的选择吗
试试:

class A< ActiveRecord::Base
      self.abstract = false
end
class A
另一种方法:


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

最简单的解决方案可能是创建一个新的基类,并让
a
B
对其进行扩展

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

classnewbaseclass
(尚未尝试此操作。)创建一个设置表名的新基础模型如何?@DaveNewton不确定我是否遵循:\Create a class用作基础类。该类将使用
set\u table\u name
设置其表名。A和B将扩展这个新的基类。我不知道它是否有效,这正是我所想的。@DaveNewton听起来不错!我不知道
set\u table\u name
。我试试看,然后告诉你。谢谢@达文尼顿,它像一个符咒!只是一个细节,
set\u table\u name
已被弃用
self.table_name=
是新事物。如果你把这个作为答案贴出来,我会接受的。再次感谢!谢谢,但是rails无法识别self.abstract
。我应该包括宝石什么的吗?另一种方法是我们目前所拥有的,它让每个人都非常困惑,包括管理员用户。