我正在OldApp
为某个类 Foo 使用 STI 的 Rails 项目。目前,我们正在进行大规模的、渐进式的重写。为了减轻痛苦,我们选择了一种非常规的方法。新的、命名空间的应用程序NewApp
现在作为一个引擎存在OldApp
。
我们将在其中重用的模型NewApp
已经创建NewApp
,OldApp
现在将这些模型用作它们的父类。为什么?现在我们可以将代码从OldApp
s 模型移动和重构到新模型,OldApp
仍然有效,测试OldApp
确保重构NewApp
不会破坏东西并且OldApp
基本上可以作为待办事项列表(如果一切OldApp
都消失了,我们就完成了)。然而 ;-)
问题是,STI 目前有点扼杀了这种(否则工作得非常好)的方法。
class OldApp::Foo < NewApp::Foo; end
class NewApp::Foo < ActiveRecord::Base; end
# in the console
OldApp::Foo.count #=> SELECT COUNT(*) FROM `foos` WHERE `foos`.`type` IN ('Foo')
NewApp::Foo.count #=> SELECT COUNT(*) FROM `foos`
当然,OldApp::Foo
这样做是因为它假设它只是 STIish 的子类,而NewApp::Foo
不是. 完全禁用 STI也不起作用,因为事实上我们正在将 STI 用于.Foo
NewApp
Whatever::Foo
Foo
我基本上是在寻找一些东西来说明NewApp::Foo
它是 STI 链的基类。
这有意义吗?有点难以解释...