2009-10-21 3 views
0

나는 Vehicle이라는 부모 클래스와 Car 클래스, Truck 클래스, SUV 클래스를 가지고있다. 나 단일 테이블 상속과 양식 (예 : 자동차, 트럭, SUV), 몇 가지 관련된 필드와 함께 선택할 수있는 형태와 같은 ID를 사용하고 레일이 연결된 유형을 빌드해야합니다. 이 표창은 더 복잡한 b/c로 만들어졌습니다. 차량은 Fleets에 속하며, 두 세트 모두 동일한 양식으로 업데이트됩니다.상속 클래스 유형을 레일에 지정하기

type_field를 사용하고 Vehicle을 Fleets의 일부로 빌드하도록 update_attributes 및 새 기능을 재정의 할 수있는 방법이 있습니까?

답변

0

나는 그것들을 오버라이드하는 것이 좋은 생각이 아니지만, (데이터베이스의 뷰에서) 그 클래스들 사이에서 유일한 차이점은 타입 필드라는 것을 명심하라.

So.

car = Car.new params['Car'] 
car.type = params['Car']['type'] # Here you should check for valid types though 
car.save 

car.reload # This might work, 
      # or you have to re-fetch it completely to actually 
      # change the class of the instance. 

올바른 유형을 제공한다을 업데이트하지만이 조금 더 어렵게 만들 수 있습니다 형태에 따라 별도의 유형은 있으나, 그렇지 않으면 당신은 필드를 구분하는 문제가있을 수 있습니다 (모든는 것, 자동차의해야 할 것이다 충돌).

그러나 하위 클래스에 대해서도 위의 작업을 수행하는 것은 문제가되지 않습니다. Truck.find(params['id']).becomes(Car)을 사용하여 안전하게 재생할 수도 있지만, Truck에 대해 별도의 로직을 사용하면 느슨해집니다.

업데이트 : 주석에 대한 응답으로

:

유형은 new(), update_attributes(), build() 또는를 통해 할당 할 수 있다는 것을 의미 보호 속성이기 때문에 예,이입니다 한 번에 여러 속성에 값을 할당 할 수있는 다른 방법. 당신은 내가 만든 코드에서 보면, 내가 두 번째 행에 할당

, 즉이 때문에 "오류"

+0

헤이 지미, 지금 내가 형태의 유형을 지정하고있어, 문제가있다 이다 컨트롤러에서 "경고 :이 보호 속성을 매스 할 수 없습니다 : 유형"오류가 발생하고 유형이 실제로 DB에 저장되지 않습니다. 이 문제를 어떻게 해결할 수 있습니까? – LMH