0

我正在OldApp为某个类 Foo 使用 STI 的 Rails 项目。目前,我们正在进行大规模的、渐进式的重写。为了减轻痛苦,我们选择了一种非常规的方法。新的、命名空间的应用程序NewApp现在作为一个引擎存在OldApp

我们将在其中重用的模型NewApp已经创建NewAppOldApp现在将这些模型用作它们的父类。为什么?现在我们可以将代码从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 链的基类。

这有意义吗?有点难以解释...

4

1 回答 1

1

使用抽象基类并让继承OldApp::FooNewApp::Foo从中可以解决问题:

class NewApp::FooBase < ActiveRecord::Base
    self.abstract_class = true
end

class NewApp::Foo < NewApp::FooBase; end
class OldApp::Foo < NewApp::FooBase; end

您可以将所有重构代码放在基类中,以便OldApp::Foo作为NewApp::FooSTI 的起点。

于 2012-09-06T14:57:43.187 回答