2012-12-14 15 views
6

私はRailsの3.2.2にいると私はバリアントクラスを持っている:自己参照「双子」has_oneの関連

class Variant < ActiveRecord::Base 

    has_one :twin_variant 

end 

私は「双子になったために、このクラスから2つのオブジェクトを関連付けることができるようにしたいのですが" 私が作成したい:

v1 = Variant.new 
v1.name = "Fantastic variant" 
v1.save 

その後、私は双子のバリアントを作成するための方法を持っているしたいと思います:

v2 = Variant.new 
v2.name = "Fantastic variant twin" 
v2.save 

v1.twin_variant = v2 

ように、その後2つのオブジェクトは、相互に関連付けなるはず:

v1.twin_variant 
=> v2 

v2.twin_variant 
=> v1 

これは可能ですか?私はどのように協会を築くべきですか?

答えて

13

あなたは

v1 = Variant.create(name: "Variant #1") 
v2 = Variant.create(name: "Variant #2") 

v1.twin_variant = v2 
v2.twin_variant = v1 

環状関係のセットアップ以下のモデル

class Variant < ActiveRecord::Base 
    attr_accessible :name, :variant_id 

    has_one :twin_variant, class_name: "Variant", foreign_key: :variant_id 
    belongs_to :twin, class_name: "Variant", foreign_key: :variant_id 
end 

でき考えると、あなたは

Variant.where(name: "Variant #2").first.twin_variant.name # "Variant #1" 
Variant.where(name: "Variant #1").first.twin_variant.name # "Variant #2" 
+0

おかげでこれを確認することができ、それは素晴らしい作品! – Augusto