Zasymulowałem dokładnie ten sam scenariusz jak twój i dowiedziałem się:
Zawsze, gdy model (Post) ma has_many through
powiązanie następnie po utworzeniu instancji tego modelu, tj. Post
przekazywanie Hash
na przykład:Post.new( JSON.parse(json) )
lub Post.new(id: 113)
wygląda na to, że Railsy traktują je inaczej, chociaż wskazują na ten sam rekord.
Uruchomiłem następujące polecenia w kolejności podanej poniżej:
p = Post.last
p.tags
p.tags.count
json = p.to_json
p2 = Post.new( JSON.parse(json) )
p2.tags
p2.tags.count ## Gives incorrect count
p3 = Post.find(JSON.parse(json)["id"]) ### See notes below
p3.tags
p3.tags.count ## Gives the correct count
Zamiast tworzyć nową instancję Posta bezpośrednio przy użyciu Hash, pobrałem rekord z bazy danych za pomocą id
uzyskane z deserializacji json. W tym przypadku instancja p3
i instancja p2
odnoszą się do tego samego posta, ale Rails interpretuje je inaczej.