2012-05-17 20 views
0

모범 사례를 찾고 있습니다. 시나리오는 다음과 같습니다.하나의 컨트롤러 동작에서 모델을 여러 번 업데이트하십시오.

고객은 양식에서 하나 이상의 위젯을 지불 할 수 있습니다. 따라서 Payments 모델과 Widgets 모델이 있습니다. 이들 간에는 연관이 없습니다 (지불은 고객과 연관되어 있음). 이것을 처리하는 가장 좋은 방법은 무엇입니까? 나는 지불 컨트롤러에서

을 할 수있는 :

def create 
    @customer = Customer.find(params[:customer_id]) 
    if @customer.payments.create!(params[:payment]) 
    how-many-widgets = params[:payment][:number].to_i 
    while how-many-widgets > 0 
     widget = Widgets.new 
     ... update widget ... 
     widget.save! 
     how-many-widgets = how-many-widgets - 1 
    end 
    end 
    redirect_to @customer 
end 

이이 작업을 수행하는 가장 좋은 방법이 있나요? 아니면 좀 더 우아한 해결책이 있습니까?

답변

1

변경 사항을 저장하고 변경하는 경우 컨트롤러가 아닌 모델에서이 코드를 수행해야합니다. 내가 코드를 리팩토링한다면, 조금 같을 것이다 :

def create 
    @customer = Customer.find(params[:customer_id]) 
    if @customer.payments.create!(params[:payment]) 
    params[:payment][:number].times do 
     Widget.create(params[:widget]) 
    end 
    end 
    redirect_to @customer 
end 

Widget.create 경우는 당신이 찾고있는 것이 아니다,에 PARAMS 소요를 변환하는 사용자 정의 방식을 마련, 그리고 나서 올바른 물체를 뱉어 버린다. 또한 위젯이 고객 또는 지불과 관련이있는 경우 주저하지 말고 해당 코드를보고 "현재 사용자/고객/지불을 위젯에 전달해야합니다 "위젯이 어떻게 든 그 모델에 연관되어야한다는 좋은 암시가 될 것입니다.

+0

우수. 감사. – thermans

관련 문제