#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 вручную.