複数レコードの一括更新

複数レコードの一括更新を実装しました。

最初はインプレース編集で実装したんですが、一件ごとの更新に意外と時間がかかるので、一括更新で再実装しました。

環境

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)

参考にしたページ

参考にした書籍

P.254-255を参考にしました。

Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応
大場 寧子 大場 光一郎 久保 優子
毎日コミュニケーションズ
売り上げランキング: 251455