Обновите несколько записей одной командой в Ruby - PullRequest
1 голос
/ 13 апреля 2020

В основном я хочу обновить массив объектов, которые мой API получает в одну команду. Я сделал это, когда я вставлял, но я не мог найти способ сделать это обновить. Вот m метод создания для нескольких вставок:

def create_all

    if Attendance.create attendance_params
        render json: { message: "attendance added" }, status: :ok
    else
        render json: { message: "error in creation" }, status: :bad_request
    end
end

Параметры:

def attendance_params
    params.require(:attendance).map do |p|

        p.permit(
            :student_id,
            :id,
            :attendance
        )
    end
end

Я пытался сделать то же самое с обновлением, но он генерирует эту ошибку:

   Completed 500 Internal Server Error in 11ms (ActiveRecord: 2.7ms) 
   Argument Error (When assigning attributes, you must pass a hash as an argument.)

мой метод обновления такой:

def update_attendance
    if Attendance.update attendance_params
        render json: { message: "attendance updated" }, status: :ok
    end
end

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Пожалуйста, проверьте этот пример и попробуйте применить его:

Attendance.where(:student_id => [23,45,68,123]).update_all(:attendance => true)

Или, если вы пытаетесь обновить все записи о посещаемости:

Attendance.update_all(:attendance => true)

Также, пожалуйста, проверьте эту ссылку: https://apidock.com/rails/ActiveRecord/Relation/update_all

0 голосов
/ 13 апреля 2020

ActiveRecord Create может принимать массив хэшей и создавать несколько записей одновременно.

Однако обновление ActiveRecord не может.

В вашей модели потенциально можно создать метод "update_batch", который позволяет массив хэшей. Вам нужно будет отправить массив хэшей, и каждый ha sh должен будет включать идентификатор обновляемой вами записи (и разрешить это в вашем определении сильных параметров). Тогда в вашем методе update_batch вам нужно будет получить идентификатор каждого ха sh и обновить каждый:

class Attendance < ActiveRecord
  def update_batch(attendance_records)
    attendance_records.each do |record|
      Attendance.find(record[:id]).update(record.except(:id))
    end
  end
end
...