Sospecho que ActiveRecord no se da cuenta de que tus friends
matriz ha cambiado porque, bueno, la referencia de matriz subyacente no cambia cuando:
self.friends.push(target)
Eso alterará los contenidos de la matriz, pero la matriz en sí seguirá siendo la misma matriz. Sé que este problema surge con la gema postgres_ext en Rails3 y dado este problema:
El atributo de cadena no está marcado como sucio, cuando cambia con <<
Espero que Rails4 se comporte de la misma manera.
La solución sería crear una nueva matriz en lugar de intentar modificar la matriz en el lugar:
update_attributes friends: self.friends + [ target ]
Hay muchas formas de crear una nueva matriz mientras agrega un elemento a una matriz existente, use la que desee.