Обновление нескольких записей Rails - PullRequest
1 голос
/ 16 марта 2020

Следующий массив логических атрибутов для нескольких записей

{"utf8"=>"✓","_method"=>"patch", "authenticity_token"=>"...",
 "ts"=>
  {"1"=>{"go"=>"0", "pickup"=>"0", "delivery"=>"1"},
   "2"=>{"go"=>"0", "pickup"=>"0", "delivery"=>"1"},
   "3"=>{"go"=>"0", "pickup"=>"0", "delivery"=>"1"},
   [...]},
 "commit"=>"Save changes"}

отправляется с одного контроллера на дочерний контроллер со следующим действием, которое имеет нестандартные имена для параметров.

   def update_all
      params[:ts].keys.each do |id|
        @daystruttimeslot = Daystruttimeslot.find(id.to_i)
        @daystruttimeslot.update(ts_params)
      end
    end

обнаруживает ошибку undefined local variable or method 'ts_params' for #<DaystruttimeslotsController:0x00007fa118f262f8> Did you mean? to_param params @_params

Как эти параметры могут быть правильно обработаны этим действием?

1 Ответ

1 голос
/ 16 марта 2020
def update_all
  ts = params.require(:ts)
  @daystruttimeslots = Daystruttimeslot.where(id: ts.keys)
  @daystruttimeslots.each do |d|
    d.update(ts.fetch(d.id.to_s).permit(:go, :pickup, :delivery))
  end
end

Это делает одну операцию чтения вместо выборки каждой записи отдельно, а также предоставляет ивар, который на самом деле имеет смысл вместо того, что находится в конце l oop.

Если вам нужно чтобы убедиться, что все идентификаторы верны, сравните ts.keys.length с @daystruttimeslots.size. Возможно, вы захотите обернуть это в транзакцию, чтобы изменения откатывались, если какое-либо обновление не удалось, вместо того, чтобы просто оставить работу наполовину выполненной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...