2009-06-24 1 views
3

내가 3 모델, Car, MotorcycleTruck을 가지고 있다고 가정하고, 각각에 대해 알려진 이전 소유자, 교통 티켓, 번호판 등의 목록과 같은 물건을 입력해야합니다. 그래서 각각에 대한 모델을 만들었습니다. (PreviousOwners, PreviousPlates 등) 관련 모델에 대한 다형성 연관을 설정합니다.Rails에서 동일한 양식의 관련 다형 모델에 액세스하여 제출하는 방법은 무엇입니까?

문제는 내가 종류의 같은, 즉 하나의 양식을 사용하는 모든 입력 할 수있는 방법입니다 :

Car #123 

Known previous owners: 
Jason Jazz 
Brian Bass [add another] 

Known previous license plates: 
12345 
67890 [add another] 

Current status: 
Cleared 
(this is a dropdown select menu, CurrentStatus is also a polymorphic association, but with predefined values.) 

etc 

이것은 전문 지식의 나의 수준을 넘어 나쁜, 방법으로 증명한다 (여기에 초보자) . 리소스는 중첩되어 있지 않으며 여러 모델에서 찾은 거의 모든 것이 중첩 리소스 용이며 다형성 연관에 적용되는 것은 없습니다.

(이것은 내가 종류로, 등, 나는 '자동차'와 Vehicle 모델을 가지고 있어야 이상적으로 알고 있지만, 그것은 단지 내 경우에는 다형성 모델의 실제 필요성을 설명하기 위해입니다, 단지 예입니다.)

감사.

답변

1

중첩 된 폼 빌더는 중첩 된 리소스 AFAIK와 연결할 필요가 없습니다. 모델 코드도 게시 할 수 있습니까?

1

여러 모델에서 단일 양식을 작성하는 데 도움이되는 RailsCast on Complex Forms이 있습니다.

+1

레일즈의 새로운 'accepts_nested_attributes_for'자료로 구식이 아니십니까? –

1

자동차/오토바이/트럭 모델이 동일한 경우 차량 모델에 유형 열을 추가해야합니다. 그렇지 않은 경우 STI (단일 테이블 상속)를 사용해야합니다.

하지만 코드를 제공하려면 먼저 모델을 먼저 봐야합니다.

2

아마 PresenterPattern는 helpfull 너무 :

http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

기본적인 아이디어는 모델 같은 역할을하고 양식에서 들어오는 모든 데이터를 처리하고 모델에 배포하는 발표자를 만드는 것입니다. 이 방법을 사용하면 여러 인스턴스를 만들어서 쉽게 PreviousOwner를 말하고 Car에 연결할 수 있습니다.

링크를 확인하십시오!

2

Rails 2.3에서 새로운 중첩 속성을 사용할 수 있지만 작동하게하려면 특정 방법으로 작성해야합니다. 트릭은 실제 다형성 객체를 작성한 다음 다형성 절에 속한 클래스를 작성해야한다는 것입니다. 이것은 내가라는 이름의 사용자가 게시 at Ryans Scraps를 발견 예입니다 Superslau은 (여기에 대한 좋은 비트를 청소했습니다) :

이 기능은 정말 굉장합니다. 나는 을 다형성 협회에서 구현했으며 작동한다!

class Task < ActiveRecord::Base 
    has_many :assets, :dependent=>:destroy 
    accepts_nested_attributes_for :assets, :allow_destroy => true 
    belongs_to :workable, :polymorphic => true 
end 



class Upload < ActiveRecord::Base 
    has_one :task, :as => :workable, :dependent=>:destroy 
    accepts_nested_attributes_for :task, :allow_destroy => true 
end 

업로드

는 작업의 일종이다. 모든 작업 에는 하나 이상의 애셋을 업로드 할 수 있습니다.

은 업로드 모델을 부모 인 으로 사용해야한다는 것을 알게되었습니다. 따라서 하나의 양식으로 업로드하려면 을 만들 수 있으며 해당 작업은 파일 업로드와 함께 항목입니다. 내 컨트롤러에서

가 : 그 어떤 이해가되지 않을 경우

def new 
    @upload = Upload.new 
    @upload.task = Task.new 
    @upload.task.assets.build 
end 

하지 걱정 마십시오, 난 그냥 사람들이 다형성과 잘 작동 accepts_nested_attributes_for 을 알려드립니다 연관성. Eloy에게 감사합니다!

+0

그것은 한 방향으로 작동하지만 다른 방향으로는 작동하지 않습니다. 업로드는 처리 할 작업 만 알고 있으므로 상황이 전혀 달라지지 않습니다. belongs_to 릴레이션은 논리적으로 다형성이 있기 때문에 다른 방법으로 시도해 볼 수 없습니다. 레일스는 무엇을 만들지 결정할 방법을 알지 못합니다. 나도 이걸로 좀 붙어있다. –

1

차량 모델을 도입하면이를 피하고 조금 더 간단하게 만들 수 있습니다. Vehicle 모델은 모든 PreviousOwners, PreviousPlates, 등 콜렉션을 가질 수 있으며 트럭, 자동차 및 오토바이 모델은 has_one Vehicle을 가질 수 있습니다.