2012-03-27 2 views
0

내가 자동차와 운전자 역무를 가지고 있다고 가정 해 봅시다. 그러나 일부 기록에는 자동차 용 운전자가 없습니다. 관계를 어떻게 매핑합니까?레일 - DB 관계

여기에 내가 가진 코드 그리고 그것은 "NoMethodError NilClass : 정의되지 않은 메서드`각 '전무는"의 오류가 발생

class Car < ActiveRecord::Base 
    has_one :driver, :foreign_key => :dr_code, :primary_key => :ca_master_code 
end 

class Driver < ActiveRecord::Base 
    belongs_to :car, :foreign_key => :dr_code, :primary_key => :ca_master_code 
end 

는 조언 바랍니다.

+0

Btw, Rails 열 이름 지정 규칙을 따르지 않는 이유가 있습니까? –

+0

나는 레거시 DB를 연구 중이다. – oprogfrogo

답변

1

이 경우 nil은 드라이버가 없음을 나타냅니다. 이것은 db 디자인 문제가 아닙니다.

드라이버가없는 차량이 올바른 경우 (레코드 생성 실수가 아닌)라면 nil 사례를 처리하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는 액티브 레코드가 드라이버가없는 사람을 무효로 돌려 줄 것을 기대했지만, 대신 구조 할 수없는 예외가 발생합니다. 레일에 'has_one_or_none'유형의 관계가 있습니까? – oprogfrogo

+0

글쎄, 당신은 예외를 던질 항상'nil' 개체에'.each'를 호출합니다. 너는 그걸 구할 필요가 없다. 단순히'each '를 호출하기 전에'nil'인지 확인하십시오. – jefflunt

0

실제로 레일스는이 문제를 완벽하게 처리하고 있습니다. eachcar.driver에 전화하고 계신다고 가정합니다. 자동차에는 운전자가 없기 때문에 car.drivernilnil.each barfs입니다.

+0

Btw, 왜 has_one 관계에서'each'를 부를까요? –

+0

각각은 내가 'find_all'을 an : 쿼리에 포함함으로써 수행한다고 믿는다. Car.find_all_by_ca_active ('Y', : include => [: driver]). 콘솔에서 해당 쿼리를 실행하면 오류가 다시 발생합니다. 여기서 내가 뭘 잘못하고 있니? – oprogfrogo

+0

'Car.find_all_by_ca_active ('Y')'의 출력은 무엇입니까? –