Ваша проблема заключалась в том, что если вы измените атрибут «на месте», это означает: без присвоения ему нового значения, Rails будет думать, что нет ничего нового для сохранения, поэтому он «оптимизирует» сохранение. 1001 *
Каждый аксессор записи вашего атрибута будет устанавливать флаг, поэтому метод save будет знать, что он должен проверить, действительно ли текущее значение отличается от значения, считанного из базы данных.
Вот почему self.foo = self.foo.gsub(/regexp/, 'string')
работает (обратите внимание, что восклицательный знак здесь не нужен) .
Если вам нужно изменить атрибут «на месте», например, с помощью gsub!
или replace
, используйте:
def perform_some_calculations!
foo_will_change!
self.foo.gsub!(/regexp/, 'string')
self.save
end