0

OldAppあるクラスのFooにSTIを使用しているRailsプロジェクトに取り組んでいます。現在、大幅な増分の書き換えが行われています。痛みを和らげるために、私たちはかなり型破りなアプローチを選びました。名前空間が設定された新しいアプリケーションは、今NewAppのところエンジンとして機能OldAppします。

再利用するモデルはでNewApp作成されており、NewAppこれらOldAppのモデルを親クラスとして使用しています。なんで?OldAppこれで、コードをsモデルから新しいモデルに移動してリファクタリングできますが、OldApp引き続き機能しますOldApp。リファクタリングによって問題が発生NewAppせず、OldApp基本的にToDoリストとして機能することを確認します(すべて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サブクラスであると想定しているためです。STIを完全に無効にしても機能しません。これは、実際にSTIを使用しているためです。NewApp::FooFooNewAppWhatever::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::FooNewApp::FooSTIの開始点として機能します。

于 2012-09-06T14:57:43.187 に答える