Ruby 没有抽象类的Rails STI(单表继承)
背景 我有一个rails 3应用程序,它有一个名为Ruby 没有抽象类的Rails STI(单表继承),ruby,ruby-on-rails-3,sti,Ruby,Ruby On Rails 3,Sti,背景 我有一个rails 3应用程序,它有一个名为a的模型,对应的表为。现在,我需要一个新的模型B,它的工作原理与a完全相同,但有一些其他的关联和方法(除了a中的那些) 问题 我决定使用STI(单表继承)。我知道我可以做像A
a
的模型,对应的表为
。现在,我需要一个新的模型B
,它的工作原理与a
完全相同,但有一些其他的关联和方法(除了a
中的那些)
问题
我决定使用STI(单表继承)。我知道我可以做像A
和B
这样的事情,但是如果将表命名为,那么已经有大量的代码了,这将需要太多的工作
所以我试着做B
,其中A
不是抽象的。我将type
列添加到as
。现在,模型B
工作得非常完美,但是模型A
不知道任何关于继承的内容,完全忽略了类型
列,所以当我创建A时
表示type
列不能为空。另外A.all
也返回B
行
我尝试过的
- 对
类型列使用默认值A
。这是可行的,但只解决了部分问题
- 在
a
模型中使用默认范围。这种方法的问题在于它过滤掉了两种模型的所有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
。我应该包括宝石什么的吗?另一种方法是我们目前所拥有的,它让每个人都非常困惑,包括管理员用户。