我正在寻找最佳实践。这是场景:
客户可以从表单中支付一个或多个小部件。所以我有一个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
这是最好的方法吗?还是有一些更优雅的解决方案?
答案 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
不是您想要的,请提出一个自定义方法,该方法接受参数,转换它们,然后吐出正确的对象。此外,如果小部件应与客户或付款相关,请不要犹豫相关 - 例如,如果您查看该代码并说“我还需要将当前用户/客户/付款传递给小部件,“这将是一个很好的暗示,小部件应该以某种方式与该模型相关联。