我正在OldApp为某个类 Foo 使用 STI 的 Rails 项目。目前,我们正在进行大规模的、渐进式的重写。为了减轻痛苦,我们选择了一种非常规的方法。新的、命名空间的应用程序NewApp现在作为一个引擎存在OldApp。
我们将在其中重用的模型NewApp已经创建NewApp,OldApp现在将这些模型用作它们的父类。为什么?现在我们可以将代码从OldApps 模型移动和重构到新模型,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 用于.FooNewAppWhatever::FooFoo
我基本上是在寻找一些东西来说明NewApp::Foo它是 STI 链的基类。
这有意义吗?有点难以解释...