Получать измененные атрибуты при обратном вызове after_update

Я пытаюсь сделать условное after_update, у меня есть следующее:

  after_update do |participant|
    Rails.logger.info "#{self.previous_changes} changed."
    if self.previous_changes.include?(:current_distance)
      #Do my stuff ...
    end
  end

Регистратор печатает пустой хеш: {}

Как проверить, какой атрибут был изменен?

Я использую: participant.update_attribute(:current_distance, distance) для обновления атрибута.

Ответ 1

Вы хотите использовать changes not previous_changes. Вы по-прежнему находитесь в одной транзакции сохранения, так что вы ищете в changes. previous_changes не будет иметь информацию до тех пор, пока обновление не завершится.

RAILS 5.1.1:
используйте saved_changes вместо changes, поскольку он будет устаревать в новых версиях.