J'ai simulé exactement le même scénario que le vôtre et j'ai découvert :
Chaque fois qu'un modèle (Post) a un has_many through association puis lors de la création d'une instance de ce modèle, c'est-à-dire Post passer un Hash par exemple :Post.new( JSON.parse(json) ) ou Post.new(id: 113) semble que Rails les traite différemment bien qu'ils pointent vers le même enregistrement.
J'ai exécuté les commandes suivantes dans l'ordre indiqué ci-dessous :
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
Au lieu de créer une nouvelle instance de Post en utilisant Hash directement, j'ai récupéré l'enregistrement de la base de données en utilisant le id obtenu à partir de la désérialisation de json. Dans ce cas, l'instance p3 et instance p2 font référence au même Post mais Rails les interprète différemment.