0

私が持っている私は、ベースモデルから継承する複数のモデル持ってどこに設定 - 標準の単一テーブル継承:STIテーブル/モデリングスキーマでは、どのようにすべてのタイプで共有されるタイプ固有の属性を持つことができますか?

class Parent < ActiveRecord::Base 
end 

class A < Parent 
end 

class B < Parent 
end 

マイSTIの設定が正しく、素晴らしい作品を!しかし、私は追加したい:descriptionのような型固有の属性。

は例えば、私は、「私は親のタイプです。のために...私の関数である」、親のすべての種類の説明をしたい、私は何度も(データの複製を避けたい

Aの各インスタンスには同じ記述が格納されています)。

最初に、これは、サブクラスでモデル固有のメソッドを持つことでした。だから、のようなもの:これは本当にサブクラスの特定のタイプのデータ(というよりもサブクラスのインスタンス自体に)あるので

class A < Parent 

    def self.description 
    "I am the A type of Parent. My function is for..." 
    end 

end 

私はこのソリューションを好きではない、あなたは、この動作を行うことに付属しているすべての問題を取得します(データの変更などの展開)

これを行うにはこれが唯一の方法ですか、それとも別の方法がありますか?

答えて

0

説明のモデルを作成するのはどうですか?

class Description < ActiveRecord::Base 
    has_many :as 
end 

class A < Parent 
    belongs_to :description 

    before_save { description_id = 1 } 
end 

このように、あなたは、データベース内のdescriptionのコンテンツを管理し、Webインターフェイスまたは移行のいずれかを介して、それを修正することができます。さらに、さまざまなサブクラスに異なる説明を簡単に追加したり、必要に応じてインスタンスごとに変更することも簡単にできます。

このアプローチの欠点は、正しい記述でモデルを作成する必要があることです。 1つの潜在的な解決策は、before_saveまたはbefore_createフックかもしれませんが、私はそれらがそれを行う唯一の方法ではないと確信しています。あなたのケースのための

+0

としてルビーダックタイピングを使用することを好みます。 before_save関数をよりダイナミックにする必要があると思いますが(idの値はハードコードされていません)、アイデアは同じです!どうもありがとうございました。潜在的なアイデアを募集するために質問を開いたままにしておきますが、確かにそれを解決しました。 –

+0

@LewaaBahmadそれを聞いてうれしいです。実際の実装ではなく、思考のためのコードとしてコードを取ってください。 'id'をハードコーディングするのは非常に嫌です。 :D – jdno

+0

ああ、絶対に。あなたは非常に蒸留された方法でコンセプトを提示しましたが、私はそれを感謝します。私はあなたが私がそれをスパイクするときに私の実装を共有します。 –

0

は、私は私の懸念に対処する幻想的なアプローチだ従わ

class ParentAll 
    def talk(object1) 
    object1.talk 
    end 
end 

class A < ParentAll 
    def talk 
    puts 'I am the A type of Parent. My function is for...' 
    end 
end 

class B < ParentAll 
    def talk 
    puts 'I am the B type of Parent. My function is for...' 
    end 
end 

@parent = ParentAll.new 
puts 'Using the A' 
@parent.talk(A.new) 
    # this will output talk from A 

puts 'Using the B' 
@parent.talk(B.new) 
    # this will output talk from B 
+0

ええ、それは私の最初の衝動でした。しかし、これはデータを更新するために、メソッドとそのサブクラスを更新しなければならないことを意味します。これはやりたくありません。会話の振る舞いはメッセージの内容とは無関係でなければならず、アプリケーションを再配布せずにメッセージを更新できるはずです。ありがとう、結構です! –

関連する問題