複数レコードの一括更新
複数レコードの一括更新を実装しました。
最初はインプレース編集で実装したんですが、一件ごとの更新に意外と時間がかかるので、一括更新で再実装しました。
環境
- Rails 2.3.5
- Ruby 1.8.7
View
ポイントは"select"の引数"machine_mode[]"です。
<td><%= select "machine_mode[]", "mode_no", [1, 2, 3, 4, 5, 6] %></td>
このようにすると、パラメータは、
"machine_mode"=>{"37"=>{"mode_no"=>"2", "reset_flag"=>"false"}, "38"=>{"mode_no"=>"1", "reset_flag"=>"false"}}
と言う、ハッシュになります。
上記の通り、自動的にidがハッシュのキーになります。
<% form_remote_tag :url => {:controller => "machine_modes", :action => "update" } do -%> <p><%= submit_tag t('button.Update') %><%= hidden_field_tag "model_id", @model_id %></p> <table class="table"> <tr> <th><%= t('activerecord.attributes.machine.machine_no') %></th> <th><%= t('activerecord.attributes.machine_mode.mode_no') %></th> <th><%= t('activerecord.attributes.machine_mode.reset_flag') %></th> <th><%= t('activerecord.attributes.machine_mode.elapsed_days') %></th> </tr> <% for @machine_mode in @machine_modes %> <tr> <td><%= @machine_mode.machine.machine_no %></td> <td><%= select "machine_mode[]", "mode_no", [1, 2, 3, 4, 5, 6] %></td> <td><%= select "machine_mode[]", "reset_flag", [["はい", true],["いいえ",false]] %></td> <td><%= @machine_mode.elapsed_days %></td> </tr> <% end %> </table> <% end -%>
Controller
updateメソッドは、最初の引数にidの配列を、2番目の引数に属性の配列を指定すると、指定したidの数だけ更新処理を行ってくれます。
ids = params[:machine_mode].keys attributes = params[:machine_mode].values MachineMode.update(ids, attributes)