2009-05-07 5 views
0

私はRailsを初めて使っていますが、関連性のある可能性はまだすべて把握していません。ここに私の問題があります:中間三重関係モデルのための良いデザインは何ですか?

私はリンゴとレモンのようなモデルのカップルを持っています。 次に、三連関係を保持するモデル「関係」があります:

件名|関係|オブジェクト

アップル| |より甘いですレモン

'関係' の移行がこれです:これは

subject_id = 1

subject_type =リンゴ

関係のような関係を格納する必要があり

create_table :relations do |t| 
    t.references :subject, :polymorphic => true 
    t.string  :relation 
    t.references :object, :polymorphic => true 
    t.timestamps  
end 

=

よりも甘い

現実にOBJECT_ID = 2

OBJECT_TYPE =レモン

私はちょうど2機種以上のものを持っているので、私は、私は主題を作り、多型オプションを使用して、列モデルに依存しないオブジェクトする必要があると思いました。

apple、lemon、relationのモデルクラスでどのように関連付けを設定しますか?関係のテーブルデザインはこれのように良いですか?

ありがとうございました!

-Alex

答えて

1

それはかなり簡単であるべきように思える、あなたが説明したDBスキーマを与える:

class Relation < ActiveRecord::Base 
    belongs_to :object, :polymorphic => true 
    belongs_to :subject, :polymorphic => true 
end 

そして、あなたの他のクラスはこの

class Apple < ActiveRecord::Base 
    has_many :object_relations, :class_name => 'Relation', :as => :object 
    has_many :subject_relations, :class_name => 'Relation', :as => :subject 
end 

class Orange < ActiveRecord::Base 
    has_many :object_relations, :class_name => 'Relation', :as => :object 
    has_many :subject_relations, :class_name => 'Relation', :as => :subject 
end 
+0

(私はこのコードをテストしていませんでした)、それが役に立てば幸い、それは私がOK =>必要なものの80%です! (私の説明は非常に単純化され、実際のケースは/より複雑でした) tha-hanx! –

0

多形が痛みISのようになります。 :

あなたがそれがひどく必要でない限り、SingleTableInhのようなsomethimngを使用してくださいeritance:

class Fruit < ActiveRecord::Base 
    has_many :relations 
    has_many :related_objects, :through => :relation, :class_name => 'Fruit' 
    has_many :relating_subjects, :through => :relation, :class_name => 'Relation' 
end 
class Relation < ActiveRecord::Base 
    belongs_to :object, :class => 'Fruit' 
    belongs_to :subject, , :class => 'Fruit' 
    validate_presence_of :object_id 
    validate_presence_of :subject_id 
    validate_presence_of :relation 
end 

そして、同じよう:

class Apple < Fruit 
    ... 
end 

私は素晴らしい