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