Podejrzewam, że ActiveRecord nie zauważa, że Twoi friends
tablica uległa zmianie, ponieważ, cóż, odwołanie do tablicy nie zmienia się, gdy:
self.friends.push(target)
To zmieni treść tablicy, ale sama tablica nadal będzie tą samą tablicą. Wiem, że ten problem pojawia się w przypadku klejnotu postgres_ext w Rails3 i biorąc pod uwagę ten problem:
Atrybut string nie jest oznaczony jako brudny, gdy zmienia się za pomocą <<
Spodziewałbym się, że Rails4 zachowa się w ten sam sposób.
Rozwiązaniem byłoby utworzenie nowej tablicy, zamiast próbować modyfikować tablicę na miejscu:
update_attributes friends: self.friends + [ target ]
Istnieje wiele sposobów tworzenia nowej tablicy podczas dodawania elementu do istniejącej tablicy, użyj tego, który Ci się podoba.