Sprawdź czy observer jest na pewno uruchamiany i czy account_id_was nie jest takie samo jak account_id.
Co do samej architektury: nazwy Operation i Account sugerują, że masz do czynienia z jakimiś danymi finansowymi. W takim wypadku zmiana Operation nie powinna być możliwa a już na pewno nie powinno dać się zmienić Account powiązanego z Operation. Coś tu mocno śmierdzi
Observer jest na pewno uruchamiany i masz rację account_id_was jest taki sam jak account_id. Czy wiesz może czemu tak się dzieje w przypadku uzycia update_attributes?
Nie zaciągaj się za mocno Bragi bo w tym kodzie dużo śmierdzi, ale staram się to pozmieniac troche
A ogólnie podejście w ten sposób robienie tego przez obserwatorów wydaje się Wam dobre czy lepiej rozrzucić to po modułach?
Z tego, co pamiętam, to problem tkwi w after_update. Po wykonaniu update_attributes obiekt jest przeładowywany i traci wszelkie informacje o zmianach (co można sprawdzić wywołując metodę Account#changes, która zwróci pusty hash). Jeśli przeniósłbyś zmiana balance do before_update, wtedy wszystko powinno działac jak trzeba.