2012-12-14 10 views
6

Sono in Rails 3.2.2 e ho una classe di Variante:autoreferenziale "gemello" associazione has_one

class Variant < ActiveRecord::Base 

    has_one :twin_variant 

end 

Mi piacerebbe essere in grado di associare due oggetti da questa classe per diventare "gemelli ". Vorrei creare:

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

Poi vorrei avere un metodo per creare una variante doppia:

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

v1.twin_variant = v2 

Poi i 2 oggetti dovrebbero diventare associati tra loro, in modo che :

v1.twin_variant 
=> v2 

v2.twin_variant 
=> v1 

È possibile? Come dovrei costruire l'associazione?

risposta

13

Dato il seguente modello

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 

È possibile impostare il rapporto ciclico con

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

v1.twin_variant = v2 
v2.twin_variant = v1 

e si può controllare questo con

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

Grazie, funziona benissimo! – Augusto