Массовое присвоение атрибутов и сохранение записей в Rails 5

#ruby-on-rails #ruby #activerecord #ruby-on-rails-5

#ruby-on-rails #ruby #activerecord #ruby-on-rails-5

Вопрос:

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

Я хочу присвоить атрибут start и end , а затем сохранить все события одновременно.

Взаимосвязь заключается:

 User has_many CalendarEvents
  

Мой метод заключается:

 def handle_calendar_update(cal_events)
  cal_events.items.each do |e|
    next if e.try(:end).nil? || e.try(:start).nil?

    params = persistable_params(e)
    google_event = user.calendar_events.where(google_id: params[:google_id])
    if google_event.empty?
      create_google_event(params)
    else
      event = google_event.first
      @current_google_events.delete(event.id)

      #THIS IS WHERE I UPDATE EXISTING RECORD
      update_google_event(event, params)
    end
  end
  user.save!
end

def update_google_event(google_event, params)
  google_event.assign_attributes(start: params[:start], end: params[:end])
end
  

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

Есть ли способ, которым я могу массово обновлять значения и фиксировать их одновременно?

Комментарии:

1. один sql UPDATE невозможен, потому что вы обновляете разные google_events с разными значениями. Единственное, что приходит мне в голову, это заключить ваш код в ActiveRecord::Base.transaction do блок, который будет заключать все ваши обновления в begin/commit инструкцию.

2. Я использовал activerecord-import с on_duplicate_key_ignore помощью. С помощью встроенных методов Rails это невозможно, если вы не создадите SQL вручную.