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

这是最好的方法吗?还是有一些更优雅的解决方案?

4

1 回答 1

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

于 2012-05-17T15:35:13.940 回答