从一个控制器操作多次更新模型

时间:2012-05-17 15:12:40

标签: ruby-on-rails

我正在寻找最佳实践。这是场景:

客户可以从表单中支付一个或多个小部件。所以我有一个Payments模型和一个Widgets模型。它们之间没有关联(付款与客户相关)。处理这个问题的最佳方法是什么?

在Payments控制器中,我可以这样做:

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 个答案:

答案 0 :(得分: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不是您想要的,请提出一个自定义方法,该方法接受参数,转换它们,然后吐出正确的对象。此外,如果小部件应与客户或付款相关,请不要犹豫相关 - 例如,如果您查看该代码并说“我还需要将当前用户/客户/付款传递给小部件,“这将是一个很好的暗示,小部件应该以某种方式与该模型相关联。