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::Foo
Foo
NewApp
Whatever::Foo
Foo
私は基本的にNewApp::Foo
、それがSTIチェーンの基本クラスであることを伝える何かを探しています。
これは意味がありますか?説明するのは少し難しい...