2012-12-14 9 views
6

jestem w Rails 3.2.2 i mam klasę Wariant:Własna referencyjna „bliźni” has_one stowarzyszenie

class Variant < ActiveRecord::Base 

    has_one :twin_variant 

end 

Chciałbym być w stanie skojarzyć dwa obiekty z tej klasy, aby stał się „bliźniaki ". Chciałbym utworzyć:

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

Następnie chciałbym mieć metodę, aby utworzyć podwójną Wariant:

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

v1.twin_variant = v2 

Następnie 2 obiekty powinny zostać powiązane ze sobą, tak że :

v1.twin_variant 
=> v2 

v2.twin_variant 
=> v1 

Czy to możliwe? Jak zbudować stowarzyszenie?

Odpowiedz

13

Biorąc pod uwagę następujący model

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 

Można skonfigurować cykliczny związek z

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

v1.twin_variant = v2 
v2.twin_variant = v1 

i można sprawdzić to z

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

Dzięki, działa świetnie! – Augusto