2009-12-11 15 views
19

Ich bin neu in RoR und spiele immer noch mit Assoziationen. Ich brauche zwei Referenzen auf ein bestimmtes Modell in einem anderen Modell. Der Gerüstcode funktioniert nicht und ich bekomme einen Fehler "nicht initialisierte Konstante".Rails Assoziation für zwei Fremdschlüssel für die gleiche Tabelle in einer Tabelle

Erzeugung Befehle:

script/generate scaffold BaseModel name:string 
script/generate scaffold NewModel name:string base1:references base2:references 
db:migrate 

generiert Modelle:

class NewModel < ActiveRecord::Base 
    belongs_to :base1 
    belongs_to :base2 
end 

und

class BaseModel < ActiveRecord::Base 
    has_many :new_models # I added this line 
end 

Wenn ich versuche, eine new_model bei /new_models/new zu schaffen, habe ich versucht, sowohl die ID und den Namen des BaseModel, aber es funktioniert nicht. Der Fehler, den ich bekommen ist:

uninitialized constant NewModel::Base1 

Ich vermutete es die Namen abbildet, so in meiner Methode erstellen, habe ich versucht, explizit die Basemodel Instanzen auf:

@new_model = NewModel.new(params[:new_model]) 
@base1 = BaseModel.find(1) # this exists 
@base2 = BaseModel.find(2) # this exists 
@new_model.base1 = @base1 # This throws the same error as above 

Gibt es etwas, ich bin fehlt?

Antwort

31

Die meisten Rails 'Magic kommt von Konvention über Konfiguration. Indem man Dinge nach Richtlinien benennt, kann Rails die meisten Konfigurationsoptionen erraten. ActiveRecord :: Associations sind keine Ausnahmen.

Das erste Argument einer ActiveRecord-Assoziation ist der Name, der innerhalb des Modells verwendet wird. Dies ist normalerweise der Name eines anderen Modells, das ist die Konvention. Standardmäßig ist der Klassenname die Singular des Assoziationsnamens in Camelcase. Der Standard-Fremdschlüssel in der Zuordnung ist der Assoziationsname, der mit "_id" postfixed wird. Wenn Ihr Assoziationsname mit diesen Mustern keinem Klassennamen oder Fremdschlüssel entspricht, müssen Sie sie als Optionen angeben.

Dies wird tun, was Sie wollen:

class NewModel 
    belongs_to :base1, :class_name => "BaseModel" 
    belongs_to :base2, :class_name => "BaseModel" 
end 

Persönlich würde ich die Verbände mehr beschreibende Namen geben, die Base1 und base2. Etwas wie folgt aus:

Bewertungen Tabelle: id, rater_id, rated_id, Bewertung

class Rating 
    belongs_to :rater, :class_name => "User" 
    belongs_to :rated_user, :class_name => "User", :foreign_key => "rated_id" 
end 

Ein anderes Beispiel hätte verwendet werden können, aber dies wurde gewählt, um hervorzuheben, wenn der Fremdschlüssel Option ist erforderlich.

0

Das an die Methode belongs_to übergebene Symbol muss der Name des anderen Modells sein. So für Ihr Beispiel, wäre es:

class NewModel < ActiveRecord::Base 
    belongs_to :base_model 
end 
Verwandte Themen