2009-12-11 3 views
19

저는 RoR을 처음 사용하면서도 연관을 가지고 계속 놀고 있습니다. 다른 모델의 특정 모델에 대한 참조가 두 개 필요합니다. 스캐 폴딩 된 코드가 작동하지 않고 "초기화되지 않은 상수"오류가 발생합니다.하나의 테이블에서 동일한 테이블에 대한 두 개의 외래 키에 대한 레일 연결

생성 명령 :

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

생성 된 모델 :

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

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

내가 /new_models/new에서 new_model을 만들려고

, 나는 ID와 이름을 모두 시도 BaseModel은 작동하지만 작동하지 않습니다. 내가 오류입니다 : 내가 부족 아무것도

@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 

있습니까 :

uninitialized constant NewModel::Base1 

나는 내 방법을 만들 수있는, 그래서 내가 명시 적으로 BASEMODEL 인스턴스를 설정하려고 이름을 매핑 추측?

답변

31

대부분의 레일즈 '마술은 컨벤션 오버 규칙에서 비롯된 것입니다. 지침에 따라 이름을 지정함으로써 레일스는 대부분의 구성 옵션에서 추측 할 수 있습니다. ActiveRecord :: Association은 예외가 아닙니다.

ActiveRecord Association의 첫 번째 인수는 모델 내에서 사용될 이름입니다. 이것은 대개 다른 모델의 이름입니다. 이것이 바로 규칙입니다. 기본적으로 클래스 이름은 camelcase의 연관 이름의 단 하나입니다. 연결의 기본 외래 키는 "_id"가 뒤에 붙는 연관 이름입니다. 연결 이름이 클래스 이름이나 외래 키와 일치하지 않는 경우 옵션으로 제공해야합니다.

이것은 당신이 원하는 것을 할 것입니다 :

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

가 개인적으로 나는이 협회 그런 base1 및 base2보다 설명적인 이름을 줄 것입니다. 이런 식으로 뭔가 :

등급 테이블 : 아이디, rater_id, rated_id, 평가

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

다른 예를 사용할 수 있었다, 그러나 이것은 외부 키 옵션이 필요한 경우 강조하기 위해 선택되었다.

0

belongs_to 방법으로 전달 된 기호는 다른 모델의 유일한 이름이어야합니다. 그래서 예를 들어, 다음과 같습니다

class NewModel < ActiveRecord::Base 
    belongs_to :base_model 
end 
관련 문제