Как собрать коллекцию не обновленных записей - PullRequest
0 голосов
/ 30 августа 2018

У меня та же проблема, и я не понимаю, как реализовать эту идею. Вот мой код:

controller.rb

def update
  begin
    dot_applications = DotApplication.where(id: params[:ids])
    bad_dot_app_update = []
    dot_applications.each do |dot_application|
      if dot_application.update!(lead_source_id: resource_params[:lead_source_id])
        dot_application.update!(lead_source_id: resource_params[:lead_source_id])
      else
        bad_dot_app_update << dot_application.update!(lead_source_id: resource_params[:lead_source_id])
      end
    end

    render dialog: {
      close_dialog: true,
      success_message: "The lead source was changed for selected applicants."
    }
  rescue StandardError => error
    render dialog: {
      close_dialog: true,
      error_message: "Can't update lead sources because #{error.message}"
    }
  end
end

Я хочу собрать не обновленную 'dot_aplication', добавить ее в массив и вставить для спасения StandartError. Помогите мне, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы должны использовать update вместо update!, потому что в ту минуту, когда исключение перехватывается, выполнение вашего кода будет остановлено и перенаправлено в блок восстановления. update, с другой стороны, возвращает только ложь при ошибке.

Попробуйте что-то вроде этого:

def update

  dot_applications = DotApplication.where(id: params[:ids])
  bad_dot_app_update = dot_applications.reject do |dot_app| # Reject element where updates are successfull
    dot_application.update(lead_source_id: resource_params[:lead_source_id])        
  end

  if bad_dot_app_update.any?
    # Here you can access the array and do whatever you want.
    errors = bad_dot_app_update.collect {|bad_dot_app| bad_dot_app.errors }
    # Collecting errors, only needs formating for printing
    render dialog: {
      close_dialog: true,
      error_message: "Can't update lead sources because #{error.message}"
    }
  else
    render dialog: {
      close_dialog: true,
      success_message: "The lead source was changed for selected applicants."
    }
  end
end
0 голосов
/ 30 августа 2018

Это сделано довольно просто. Если вы наберете #update! вместо #update, код вызовет исключение при сбое первой записи, переходя к блоку восстановления (таким образом останавливая дальнейшее обновление записей).

Вы можете достичь желаемого результата, вызвав #update внутри блока #group_by, сгруппировав записи по их состоянию сохранения:

dot_applications = DotApplication.where(id: params[:ids])
saved = dot_applications.group_by do |dot_application|
  dot_application.update(lead_source_id: resource_params[:lead_source_id])
end

# Saved records will be in `saved[true]` unsaved records will be in
# `saved[false]`. If all records saved `saved[false]` will be `nil`. If none of
# the records saved `saved[true]` will be `nil`.

if saved[false]
  # some (or all) records didn't save
  unsaved_ids = saved[false].pluck(:id).join(', ')
  render dialog: {
    close_dialog: true,
    error_message: "The following selected applicants didn't save: #{unsaved_ids}"
  }
else
  # success
  render dialog: {
    close_dialog: true,
    success_message: "The lead source was changed for selected applicants."
  }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...