1

私のContractフォームでは、ユーザーがUnitドロップダウン ボックスから 1 つを選択するか、チェック ボックスのグループから複数のユニットを選択できるようにしています。ドロップダウン フィールドには名前が付けられunit_id、複数のチェックボックスには名前が付けられmulti_unit_ids[]ます。(これらのオプションは両方ともページにあるため、同じ名前を使用することはできません)。

選択したユニットごとに 1 つの契約が作成されます。したがって、ユニットが 1 つだけ選択された場合、そのユニットは 1 つだけContract作成されunit_idます。ただし、複数のユニットを選択すると、Contract作成された各ユニットのすべてのデータは同じになりますが、それぞれに独自のユニット ID (multi_unit_ids 配列から取得) があります。

create私のメソッドのコードは次のcontracts_controller.rbとおりです。

# Multiple Units? Multiple Contracts
if params[:multi_unit_id]
  unit_arr = params[:multi_unit_id]
else
  unit_arr = [*params[:contract][:unit_id]]
end


# Loop through units
unit_arr.each do |unit_id|
  # Assign the unit id to the params for easy creation
  params[:contract][:unit_id] = unit_id

  @contract = Contract.new(params[:contract])
  # ... other code here
  @contract.save
end

これはすべてとても面倒です!これを行うためのより良い方法は何ですか?

4

1 に答える 1

1

ループなしでこれらのデータベース エントリを作成する限り、私は多くの提案をすることはできません。# ... other code hereそれが可能かどうかはわかりませんが、実際には、省略したセクションに混乱がない限り、そのループは本当にストレスを感じるほど乱雑に見えません。

実際、私がこれから提案することは、コードがより乱雑に感じられるかもしれません。

ActiveRecord::Base.transaction多くのデータベース行を作成する予定がある場合は、ループを次のようにラップすることをお勧めします。

# Loop through units
ActiveRecord::Base.transaction do
  unit_arr.each do |unit_id|
    # Assign the unit id to the params for easy creation
    params[:contract][:unit_id] = unit_id

    @contract = Contract.new(params[:contract])
    # ... other code here
    @contract.save
  end
end

または、作成を 1 つのクエリに結合する他の手段を使用します (他のオプションと、http://www.coffeepowered.net/2009/01/23/mass-inserting-data-in-railsで利用可能なベンチマークがあります)。 -あなたのパフォーマンスを殺さずに/ )。

ただし、リファクタリングに関しては、ここで多くを提供することはできません。

于 2012-08-09T23:56:04.230 に答える