0

ベストプラクティスを探しています。シナリオは次のとおりです。

顧客は、フォームから1つ以上のウィジェットの料金を支払うことができます。だから私は支払いモデルとウィジェットモデルを持っています。それらの間に関連付けはありません(支払いは顧客に関連付けられています)。これを処理するための最良の方法は何ですか?

支払いコントローラーでは、次のことができます。

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 に答える