2012-05-17 37 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

相關問題