Je soupçonne qu'ActiveRecord ne remarque pas que vos friends
array a changé parce que, eh bien, la référence de tableau sous-jacente ne change pas lorsque vous :
self.friends.push(target)
Cela modifiera le contenu du tableau, mais le tableau lui-même sera toujours le même tableau. Je sais que ce problème surgit avec le gem postgres_ext dans Rails3 et compte tenu de ce problème :
L'attribut de chaîne n'est pas marqué comme sale, lorsqu'il change avec
<<
Je m'attendrais à ce que Rails4 se comporte de la même manière.
La solution serait de créer un nouveau tableau plutôt que d'essayer de modifier le tableau sur place :
update_attributes friends: self.friends + [ target ]
Il existe de nombreuses façons de créer un nouveau tableau tout en ajoutant un élément à un tableau existant, utilisez celui que vous préférez.