は、だから私は最近シングルテーブル継承に探してきたが、この一般的な質問/答えを発見した:Rails - 単一テーブル継承 - 欠陥のあるキャストアプローチ?
質問:あなたは、アルファベータ<を想定し、 ベータ版へのAlphaからオブジェクト
obj
のクラスを変更するにはどうすればよいです、STIで?答え:ルビーはアヒル型言語なので、キャストは使用しません。しかし、あなたがする必要があるのは、「タイプ」変数に「ベータ版」に設定し、オブジェクトを保存し、次回は、あなたはそれが型ベータ版のものであろうアルファオブジェクトにロードされます。ただし、この
obj = Alpha.new obj.save #now obj is of type Alpha obj.type = "Beta" obj.save #now obj is of type Beta
をアプローチは私のために働いていないようです。 objは正しく保存されますが、Betaオブジェクトとしてはまったく機能していないようです。ベータ検証を実行せずに保存し、obj.respond_to?(:beta_method) #beta_method being a method in the beta class
をチェックするとfalseを返します。このアプローチは機能しませんか?正しいアプローチはありますか?あるいは私は単に何か間違っているのですか? (:beta_method)(:beta_method)(真Alpha.lastとベータ版の両方が返さBeta.last.respond_toは、一方でそれは、falseが返さ
EDIT
私はAlpha.last.respond_toをしたときことがわかりました。最後に同じオブジェクトが返されました)。興味深い開発ですか?それでも誰かがこれを(ルビが継承をどのように処理するかに関して)詳細に説明できればそれはすばらしいでしょう。
私はこの答えがかなり正しいとは思わない。 OPでは、 'obj.type =" Beta "; obj.save'はDBを更新しませんが、メモリ内のバージョンはアルファとして型キャストされます。 'obj.reload'を実行すると、RailsはそれがAlphaであることを期待しているので、この場合は動作しません。 obj2 = Beta.find(obj.id) ' –
...でも、@Teoulasが以下で説明するように' obj.becomes(Beta) 'を使用することをお勧めします。 –
私はデータベースが更新されていないとは決して言いませんでした。私が言ったことは、型を "ベータ"に変更することで、Rubyは気にしません(まだAlphaのインスタンスを持っています)。次の段落で述べたように、ActiveRecordが新しいレコードをデータベースから取得すると、ベータインスタンスが作成されます。 (なぜ私は#私の元の記事ではなく、あなたが言うように、他の誰かがそれを持ってきたことを思い出しません。) –