Mi lectura de https://apidock.com/rails/ActiveRecord/Dirty
es que tienes que llamar a ..._will_change! antes cambias el atributo. Debería poder confirmar esto examinando changes bajo varios escenarios.
Actualización:acabo de probar el comportamiento con un atributo de cadena y todavía guarda la cadena actualizada incluso si el cambio se realizó antes de ..._will_change se llama, por lo que mi interpretación puede estar mal.