2009-08-31 24 views
0

FooBarという2つのモデルクラスがある場合、Fooテーブルの外部キーを使用して、3つの異なるプロパティ名を使用してFooにBarのインスタンスを3つずつ追加します。バーは別々に管理され、Fooの多くのインスタンスに属することができます。これは、多少(?私は思う)、明らかにhas_oneを使用するために間違った団体である、それを説明する:1つのモデル内で複数の1対多の関連付け

Foo 
    has_one :prop_a, :class_name => "Bar" 
    has_one :prop_b, :class_name => "Bar" 
    has_one :prop_c, :class_name => "Bar" 

Bar 

bar_type文字列フィールドで示されるバーの3つの潜在的な種類があります、Fooの上の各参照は、これらのいずれかに対応します。例えばFoo.prop_aは、bar_type = 'type_a'のBarインスタンスを参照しています。 Railsでこのタイプの関連付けを作成するにはどうすればよいですか?

答えて

1

ここで間違った関連付けが使用されていることは間違いありません。

ActiveRecordでは、の外部キーは常にbelongs_toのモデルです。これは次のようになり指定するには、このシナリオFooクラスで

実際belongs_toそれらの小道具

一つの方法:

class Foo < ActiveRecord::Base 
belongs_to :prop_a, :class_name => "Bar", :foreign_key => "prop_a_id" 
belongs_to :prop_b, :class_name => "Bar", :foreign_key => "prob_b_id" 
belongs_to :prop_c, :class_name => "Bar", :foreign_key => "prob_c_id" 
end 

これはしかし意味するところ、あなたは「prop_a_id, prop_b_idというタイトルのFooの列を持たなければならないということです「prop_c_id」は、Barテーブルの主キーである整数を格納することができる。

このソリューションは、しかし、ActiveRecordの会の下にリストされている問題の世話をしていません。上で提案されているソリューションについては、RailsとSingle Table Inheritanceを参照する必要があります。あなたがこれをgoogleにすれば、あなたはそれについて多くのリソースを見つけることができます。個人的には、Agile Web Development with Railsをお勧めします。第3版では377ページで見つけることができます。また、初心者向けのSTIの書きかけがありますhere

幸運を祈ってください!

1

なぜ継承を使用しません。あなたはBarから継承する3つのクラスを作成できます。データベースに型の列があるだけです。

class Foo 
    has_one :bara 
    has_one :barb 
    has_one :barc 
end 

class BarA < Foo 
    belongs_to :foo 
end 

class BarB < Foo 
    belongs_to :foo 
end 

class BarC < Foo 
    belongs_to :foo 
end 

その後、移行がbara_id、barb_idとbarc_id列を持っている必要があります。

私はこれを試していないが、それは動作するはずです。

one = Foo.new 
two = BarA.new 
three = BarB.new 
four = BarC.new 
one.bara = two 
one.barb = three 
one.barc = four 
one.save 

one.bara.foo #=> one 
one.bara.bara = BarA.new 
one.bara.bara.foo #=> two 
関連する問題