2009-04-21 8 views
2

Mein Verständnis von RoR fehlt leider. Ich habe drei Eins-zu-Eins-Beziehungen, die ich in einer Ansicht beibehalten möchte. Ich habe folgende Modelle:Basic Rails Frage: One-to-One-Beziehungen

class Ood< ActiveRecord::Base 
    has_one :female_trait 
    has_one :male_trait 
end 

class Female_Trait < ActiveRecord::Base 
    belongs_to :ood 
end 

class Male_Trait < ActiveRecord::Base 
    belongs_to :ood 
end 

Ein Ood entweder einen Eintrag in der Tabelle Female_Trait oder Male_Trait Tisch haben würde, aber nicht beides. Meine Bemühungen, die gerüsteten new/create edit/update-Definitionen in meinem OodController zu optimieren, waren nicht erfolgreich. Hier ist ein Beispiel für meine fehlerhafte Logik in OodController:

def new 
    @ood = Ood.new 
    @female_trait = Female_trait.new 
    @male_trait = Male_trait.new 
    ... 
end 

def create 
    @ood = Ood.new(params[:ood]) 
    if !params[:female_trait][:trait1].blank? and !params[:female_trait[:trait2].blank? 
    @female_trait = @ood.female_trait.build(params[:female_trait]) 
    if !params[:male_trait][:trait1].blank? and !params[:male_trait[:trait2].blank? 
    @male_trait = @ood.male_trait.build(params[:male_trait]) 
    ... 
end 

Welches Konzept, das ich fehle?

+0

Haben female_trait und male_trait ähnliche Attribute? –

+0

Nein, ich habe versucht, meinen Beispielcode zu verkürzen und sollte trait1 bis trait4 verwenden, anstatt trait1 und trait2 wiederzuverwenden. – littlebit

Antwort

2

Warum nicht eine polymorphe Beziehung verwenden, die auf Female_Trait oder Male_Trait verweist?

class Ood< ActiveRecord::Base 
    belongs_to :trait, :polymorphic => true 
end 

class Female_Trait < ActiveRecord::Base 
    has_one :oods, :as => :trait 
end 

class Male_Trait < ActiveRecord::Base 
    has_one :oods, :as => :trait 
end 
+1

Wie kann man das in der Migration ausdrücken? –

+0

ja? Kannst du ein Beispiel zeigen, wie man Female_Trait-Objekte erstellen kann? –