Это потому, что ActiveRecord обнаруживает, что атрибуты изменены, через установщик.Поэтому, если вы используете gsub!
для атрибута, ActiveRecord не знает, что ему нужно обновить базу данных.
Возможно, вам придется сделать это:
part.title = part.title.gsub REGEX, '\2 \1'
Обновить скомментарий
Также, если вы попытаетесь присвоить заголовок другой переменной, а затем gsub!он также не будет работать, потому что это один и тот же объект (код из моего проекта, имена переменных разные).
ruby-1.9.3-p0 :020 > t = p.name
=> "test"
ruby-1.9.3-p0 :023 > t.object_id
=> 70197586207500
ruby-1.9.3-p0 :024 > p.name.object_id
=> 70197586207500
ruby-1.9.3-p0 :025 > t.gsub! /test/, 'not a test'
=> "not a test"
ruby-1.9.3-p0 :037 > p.name = t
=> "not a test"
ruby-1.9.3-p0 :026 > p.save
(37.9ms) BEGIN
** NO CHANGES HERE **
(23.9ms) COMMIT
=> true
Вы должны .dup
строку перед ее изменением.
ruby-1.9.3-p0 :043 > t = p.name.dup
=> "test"
ruby-1.9.3-p0 :044 > t.gsub! /test/, 'not a test'
=> "not a test"
ruby-1.9.3-p0 :045 > p.name = t
=> "not a test"
ruby-1.9.3-p0 :046 > p.save
(21.5ms) BEGIN
(20.8ms) UPDATE "projects" SET "name" = 'not a test', "updated_at" = '2012-01-02 07:17:22.892032' WHERE "projects"."id" = 108
(21.5ms) COMMIT
=> true