2012-01-14 12 views
0

TutorSessionの2つのクラスが同じ子クラスFieldを多相関係で共有しています。Railsで多態性を持つ別のオブジェクトから子オブジェクトを作成する方法

チューターがセッションを作成するときに、チューターからセッションに自動的にコピーされるタイトルを持っています(つまり、新しいエントリが 'フィールド'テーブルに追加されます)。例えば、

t = Tutor 
Session.fields.build_from_tutor(t.fields) 

私はちょうどbuild_from_tutor方法を構成しています。これを行うためのRails/Rubyの方法はありますか?

ありがとうございます。

答えて

1

同じエントリを2つのクラスの子として存在させたい場合は、多態性ではありません。それはちょうど相続が混乱している。どちらのTutor has_many :sessions、およびSession has_many :fields、ひいてはTutor has_many :fields, :through => :sessions、または交互に、Tutor has_many Sessions, :as => :fieldableSession has_many :fields, :as :feildable、およびField belongs_to :fieldable, :polymorphic => trueが、それは不可能にはチューターとセッションが今までフィールドを共有します。

だから、それを理解する必要があります。その後、あなたは元気なビルダーを見つけることができます。しかし、あなたが持っている方法では、データモデルを正規化することはできません。 Railsアプリケーションであっても、最小限の標準であるIMHOとして3NFに身を任せてください。

+0

ありがとうございました。いいえ、私は2つのクラスについて同じエントリーを望みません。先生の各トピックについて、1つのレコードがあります。セッションの各トピックについて、別のレコードがあります。トピックは、チューターとセッションとの多形性の関係を持っています。 – AdamNYC

+0

多分私は質問が表現された方法で混乱しています。もしFieldsが本当に多態的で、 'Tutor'から' Session'にコピーされたいのであれば、 'Session'と同時に' Tutor'を作成しなければならない場合、コールバックを使うことができます: ''クラスの先生。 after_save:make_session; def make_session; self.topic.build_session(:title => self.title); end; end'このアプローチの問題は、3NFとDRYの原則に違反していることです。データベース内の情報を複製しています。 'title'が2つのレコードに存在する必要がある場合は、DBスキーマを修正する必要があります。 –

関連する問題