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

相关问题