前提・実現したいこと
Railsのupdate_allを使ってSQLの発行回数を抑えてデータを一括更新したい。
具体的には、更新予定のIDを配列で受け取り、Attributeであるitem_group_idを一括で変更したい。
発生している問題・エラーメッセージ
以下のようなエラーメッセージと共にデータが更新できない。
ExampleItemsController::error_json no implicit conversion of Hash into String
該当のソースコード
【example_items_controller.rb】
Ruby
1 def update 2 ids = params[:example_item]&.[]("update_ids") 3 ExampleItem.where(id: ids).update_all(update_params.except(:update_ids)) 4 end 5 6 private 7 8 def update_params 9 params.require(:example_item).permit( 10 :item_group_id, update_ids: [] 11 ) 12 end
【パラメーター】
Processing by ExampleItemsController#update as JSON Parameters: {"example_item"=>{"update_ids"=>["1", "2", "3"], "item_group_id"=>"2"}}
試したこと
①update_allではなくupdateを使用
これで更新自体はできましたが、update_ids一つ一つを更新するSQLの為、『少ないSQLでのデータ一括更新』は実現できませんでした。
②パラメーターをJSONに変換
参考記事
↑等を参照に、RailsのHashをJSONにパースする必要があるのでは?と考え、
Ruby
1 def update 2 ids = params[:example_item]&.[]("update_ids") 3 ExampleItem.where(id: ids).update_all(JSON.parse(update_params.except(:update_ids))) 4 end
とするも、全く同じエラーになり一括更新が出来ませんでした。
ExampleItemsController::error_json no implicit conversion of ActionController::Parameters into String
③ストロングパラメーターを使わずにデータを更新
以下のようにストロングパラメーターを使用しないで実装するとupdate_allで更新できましたが、今後item_group_id以外も更新することがあればその度に処理を追加しなければならないので、ストロングパラメーターを定義したいと考えております。
【example_items_controller.rb】
Ruby
1 def update 2 ids = params[:example_item]&.[]("update_ids") 3 ExampleItem.where(id: ids).update_all(item_group_id: params[:example_item]&.[]("item_group_id")) 4 end
ご教示いただきたいこと
- リストメソッドはupdate_allを使用
- ストロングパラメーターを定義
以上の2つの条件を満たした上で、
『更新予定のIDを配列で受け取り、Attributeであるitem_group_idを一括で変更したい。』
について、ご教示いただけませんでしょうか。
お手数をおかけし大変恐縮ですが、何卒宜しくお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/20 12:38
2021/02/20 13:26
2021/02/20 22:55
2021/02/20 23:28
2021/02/21 11:07
2021/02/21 12:00
2021/02/21 22:26
2021/02/21 22:57
2021/02/23 22:01 編集
2021/02/22 04:15
2021/02/22 04:31
2021/02/22 04:33 編集
2021/02/22 04:53 編集