1

업데이트 :이 문제에 대해 다시 생각한 후에이 질문에 다형성과 STI가 모두 포함되어 있다고 생각합니다.Rails 다형성/단일 테이블 상속 모델

class Vehicle < ActiveRecord::Base 
    belongs_to :dealership 
    ... 
end 

class Car < Vehicle 
    ... 
end 

class Truck < Vehicle 
    ... 
end 

기록 자동차 및 트럭 모델은 모델에서 동일한 속성하지만 서로 다른 논리를, 그래서 그들 모두는 단지 차량 테이블을 사용

의 다음 I가 있다고 가정 해 봅시다.

누군가가 새로운 차량 기록을 만들고 "자동차"인지 "트럭"인지 선택할 수있는 일반 양식을 만들고 싶습니다. 백엔드에서이 양식은 일반 "Vehicle"레코드가 아닌 "Car"또는 "Truck"레코드를 생성해야합니다.

질문 : 이 옵션을 Rails 양식에 어떻게 표시 하시겠습니까? 구체적으로, 추상 기본 모델의 하위 유형을 나열하는 메소드가 있습니까? 그리고/또는이를 폼의 Select 요소처럼 제시 할 수있는 간단한 방법이 있습니까?

자동차 나 트럭을 자동차와 트럭 용으로 두 가지 형태로 만드는 것에 반대 할 수있는 양식을 만드는 이유는 마침내이 모델이 부모님에게 중첩되도록하는 것입니다. " 판매권." 나는 새로운 차량을 만들고 옵션으로 "자동차"또는 "트럭"을 선택할 수있을뿐만 아니라 사용자가 "딜러"를로드하고 모든 자동차를 보거나 편집 할 수있는 중첩 된 양식을 가질 수 있기를 바랍니다. 그 딜러에 속한 트럭을 단일 형태로 나는 Vehicle belongs_to :dealership과 같은 간단한 연관에서 accepts_nested_attributes_for을 사용하여이를 설정하는 방법을 알고 있지만 Vehicle에서 상속 한 하위 모델을 설정하는 방법을 잘 모르겠습니다.

답변

0

나는 틀릴 수도 있지만, 다른 방법으로는 polymorphic을 이해합니다. 나는 모델은

CarTruck

Vehicle의 일종이다 ... 더 이상의 다른 모델에 속할 수 있습니다 의미합니다. 따라서 Vehicle에는 yearmark 속성이 있다고 가정 해 보겠습니다.

Car 또는 Truck을 새로 만들 수 있으며 다형성을 정의하면 평소처럼 양식을 만들 수 있습니다. 나는 그것이 도움이되기를 바랍니다

@car = Car.find(id) 
@vehicle = @car.vehicles.build(year: "1999", mark: "Beetle") 
@vehicle.save 

...

+0

너는 내가 실제로 다형성과 STI를 모두보고있는 것을 안다. 내가 원래 질문을 썼을 때 나는 그들과 약간 섞여 있었다. 의견을 보내 주셔서 감사합니다! – Andrew

+0

네, 지금 무슨 뜻인지 이해합니다. 내가 당신을 위해 유용한 링크를 찾은 것 같아요 : http://stackoverflow.com/questions/5047613/rails-model-inheritance-in-forms – gabrielhilal

0

나는 양식의 간단한 선택 요소가 문제의 해결책이 생각하지 않습니다. 여기서 달성하고자하는 것은 Multiple Table Inheritance이며, 문제는 데이터베이스에 쉽게 반영되도록 모델을 구조화해야하는 방법이어야합니다. 긴 토론이기 때문에 나는 이것을 this article으로 안내 할 것이며, 최적의 방법을 설명 할 것입니다. 내가 당신을 도왔 으면 좋겠 :)

추신 : 귀하의 질문에 대답하기 위해, 아니 거기에 그런 종류의 일을 레일 프레임 워크에 내장 된 메커니즘입니다.

+0

기사 링크를 주셔서 감사합니다 그것은 비슷한 문제를 해결할 것 같습니다. 내가 한번 볼게. – Andrew

1

동일한 문제가있었습니다. 기본적으로 has_many 기본 클래스의 연결을 허용하는 양식을 작성하려고하지만 모든 Decorated/Concrete 클래스에 대해 개별 양식 (중첩 필드 추가)을 동적으로 작성하려고합니다.

정확한 필드를 양식에 동적으로 추가하는 방법을 제공하는 cocoon gem을 사용하여이를 해결했습니다.같은 _form 부분 외모 뭔가 :

# _form.html.haml 

= simple_form_for @dealership, :html => { :multipart => true } do |f| 

    = f.simple_fields_for :vehicles do |vehicle| 
    = render 'vehicle_fields', :f => vehicle 
    = link_to_add_association 'Add a Car', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Car.new } 
    = link_to_add_association 'Add a Truck', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Truck.new } 

= f.button :submit, :disable_with => 'Please wait ...', :class => "btn btn-primary", :value => 'Save' 

그리고 다음 _vehicle_fields

# _vehicle_fields.html.haml 

- if f.object.type == 'Car' 
    = render 'car_fields', :f => f 
- elsif f.object.type == 'Truck' 
    = render 'truck_fields', :f => f 

car_fieldstruck_fields 또한, https://github.com/nathanvda/cocoon:wrap_object 문서에서 봐 cocoon

에서 제공하는 링크 link_to_remove_association 기능 것 또는 내 블로그 게시물 http://www.powpark.com/blog/programming/2014/05/07/rails_nested_forms_for_single_table_inheritance_associations