だから私は最近単一テーブル継承を調べていて、この一般的な質問/回答を見つけました:
質問:STIでBeta <Alphaと仮定して、オブジェクトのクラスを
obj
AlphaからBetaにどのように変更しますか?回答:ルビーはダックタイプの言語なので、キャストは使用しません。ただし、必要なのは「type」変数を「Beta」に設定してオブジェクトを保存することだけです。次にAlphaオブジェクトをロードすると、タイプはBetaになります。
obj = Alpha.new obj.save #now obj is of type Alpha obj.type = "Beta" obj.save #now obj is of type Beta
ただし、このアプローチは私にはうまくいかないようです。objは正しく保存されますが、ベータオブジェクトとしてはまったく機能していないようです。ベータ版の検証を実行せずに保存し、チェックobj.respond_to?(:beta_method) #beta_method being a method in the beta class
するとfalseが返されました。このアプローチは機能しませんか?正しいアプローチはありますか?それとも私は単に何か間違ったことをしているのですか?
編集
Alpha.last.respond_to(:beta_method)を実行すると、falseが返され、Beta.last.respond_to(:beta_method)がtrueを返すことがわかりました(ただし、Alpha.lastとBeta.lastの両方が同じオブジェクトを返しました)。興味深い開発?それでも、誰かがこれを(rubyが継承を処理する方法に関して)詳細に説明できれば、それは素晴らしいことです。