Sospetto che ActiveRecord non si accorga dei tuoi friends
l'array è cambiato perché, beh, il riferimento all'array sottostante non cambia quando tu:
self.friends.push(target)
Ciò modificherà i contenuti dell'array ma l'array stesso sarà sempre lo stesso array. So che questo problema si presenta con la gemma postgres_ext in Rails3 e dato questo problema:
L'attributo stringa non è contrassegnato come sporco, quando cambia con <<
Mi aspetto che Rails4 si comporti allo stesso modo.
La soluzione sarebbe creare un nuovo array invece di provare a modificare l'array sul posto:
update_attributes friends: self.friends + [ target ]
Esistono molti modi per creare un nuovo array aggiungendo un elemento a un array esistente, usa quello che preferisci.