首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails子类和STI

Rails子类和STI
EN

Stack Overflow用户
提问于 2012-09-06 14:39:12
回答 1查看 249关注 0票数 0

我正在从事一个Rails项目OldApp,该项目将STI用于类Foo。目前,我们正在进行大规模的、渐进的、重写的工作。为了减轻痛苦,我们选择了一种相当非常规的方法。新的、命名空间的应用程序NewApp目前在OldApp中充当引擎。

我们将要在NewApp中重用的模型是在NewApp中创建的,OldApp现在使用这些模型作为它们的父类。为什么?现在我们可以将代码从OldApp的模型移到新的模型中,OldApp仍然有效,OldApp的测试确保NewApp中的重构不会破坏东西,OldApp基本上可以作为一个待办事项列表工作(如果OldApp中的所有内容都消失了,我们就完成了)。然而;-)

问题是,STI在某种程度上扼杀了这一方法(否则会很好地发挥作用)。

代码语言:javascript
复制
   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链的基类。

这有道理吗?有点难以解释..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-06 14:57:43

使用抽象基类并让它继承OldApp::FooNewApp::Foo,就可以做到这一点:

代码语言:javascript
复制
class NewApp::FooBase < ActiveRecord::Base
    self.abstract_class = true
end

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

您将把所有重构的代码放在基类中,以便OldApp::FooNewApp::Foo充当STI的起点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12302535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档