2009-12-11 20 views
19

RoR'da yeniyim ve yine de derneklerle oynuyorum. Başka bir modelde belirli bir modele iki referansım olmalı. İskele kodu çalışmıyor ve "başlatılmamış sabit" bir hata alıyorum.Bir tabloda aynı tablonun iki yabancı anahtarı için ilişkiyi kurar

Nesil komutları:

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

Oluşturulan modeller:

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

ve

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

Ben /new_models/new bir new_model oluşturmaya çalışın

, ben kimliği ve adı hem çalıştı BaseModel, ancak çalışmıyor. Ben olsun hatadır: Kaçırdığım şey

@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 

var mı:

uninitialized constant NewModel::Base1 

Ben benim yöntemi oluşturmak o kadar, ben açıkça BaseModel örneklerini ayarlamak için çalıştı, isimlerini haritalar tahmin?

cevap

31

Rails'in sihirbazının çoğu sihirbazının konfigürasyonu konvansiyonundan gelir. Bir şeyi kurallara göre isimlendirmek Rails, yapılandırma seçeneklerinin çoğunda tahmin edebilir. ActiveRecord :: Dernekler bir istisna değildir.

Herhangi bir ActiveRecord Association'ın ilk argümanı, modelde kullanılacak addır. Bu genellikle başka bir modelin adı, bu kongre. Varsayılan olarak sınıf adı, camelcase'deki ilişkilendirme adının tekilidir. İlişkilendirmede varsayılan yabancı anahtar, "_id" ile yapıştırılmış ilişkilendirme adıdır. İlişkilendirme adınız bu sınıf tarafından bir sınıf adıyla veya yabancı bir anahtarla eşleşmiyorsa, bunları seçenekler olarak sağlamanız gerekir.

İstediğin yapacak:

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

Şahsen ben, derneklerin bu Base1 ve temel2 daha açıklayıcı isimler verecekti. Böyle bir şey:

Puanları tablosu: id, rater_id, rated_id, derecelendirme

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

farklı bir örnek kullanılmış olabilir, ama bu yabancı anahtar seçenek gerektiğinde vurgulamak için seçilmiştir.

0

belongs_to yöntemine iletilen sembol, diğer modelin tekil adı olması gerekir. Yani örneğin, olurdu:

class NewModel < ActiveRecord::Base 
    belongs_to :base_model 
end 
İlgili konular