我正在从事一个Rails项目OldApp,该项目将STI用于类Foo。目前,我们正在进行大规模的、渐进的、重写的工作。为了减轻痛苦,我们选择了一种相当非常规的方法。新的、命名空间的应用程序NewApp目前在OldApp中充当引擎。
我们将要在NewApp中重用的模型是在NewApp中创建的,OldApp现在使用这些模型作为它们的父类。为什么?现在我们可以将代码从OldApp的模型移到新的模型中,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会这样做,因为它假设它只是NewApp::Foo的一个STIish子类,而不是NewApp的基本Foo类。在Whatever::Foo中完全禁用STI也不起作用,因为实际上我们正在为Foo使用STI。
我基本上是在寻找一些东西来告诉NewApp::Foo,它是STI链的基类。
这有道理吗?有点难以解释..。
发布于 2012-09-06 14:57:43
使用抽象基类并让它继承OldApp::Foo和NewApp::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::Foo充当STI的起点。
https://stackoverflow.com/questions/12302535
复制相似问题