0

J'ai une relation has_many: through associant des joueurs à des équipes à travers des managements. Je veux avoir un compteur sur la table des équipes (un peu comme un contre-cache) qui me dit combien de nouvelles associations il y a eu depuis le début de la semaine. Bien sûr, un cache de compteur ne fonctionnera pas car il donnera toujours toutes les associations qui ont déjà été créées.Mise à jour d'un enregistrement associé à partir d'un modèle de table de jointure

J'ai essayé de mettre à jour l'équipe associée à partir du modèle de gestion. Cela ne réussit jamais. Même si l'incrément à l'équipe associée semble être sauvegardé, OK, après la création de l'association mon compteur est toujours 0.

J'ai également essayé d'utiliser un observateur. L'observateur a été appelé comme je m'y attendais, j'ai pu récupérer l'équipe, mais les mises à jour, encore une fois, n'ont pas été sauvegardées.

Je suis sûr qu'il me manque quelque chose d'évident! Quel est le moyen de mettre en œuvre cela?

Je configure un github pour illustrer le problème, l'exécution de rake spec échouera.

http://github.com/steveybaby/assoc_problem

+0

Comment incrémentez-vous le compteur d'équipe à partir du modèle de gestion? –

Répondre

0

Dans votre spec:

fanteam_spec.rb

it "should be able to create a fanteam" do 
    @fanteam.save 
    @fanteam.changes.should be(0) 
    @fanteam.should be_valid 
    @fanteam.players << Factory.build(:player) 

    @fanteam.reload # this is what you are forgetting 

    @fanteam.changes.should be(1) 
    end 

Fondamentalement votre observateur met à jour le même enregistrement, mais pas le même objet.

+0

oh, et j'ai oublié de mentionner que vous devriez utiliser la méthode increment_counter d'ActiveRecord, car elle est atomique et conviviale, pour ainsi dire. – psyho

+0

Merci l'homme - quelle erreur stupide! –

+0

Ca m'a passé plus d'une fois aussi :) – psyho

0

Je soupçonne que le problème est que vous avez nommé le contre-champ changes, qui est déjà une méthode ActiveRecord pour inspecter les modifications apportées aux attributs d'un enregistrement depuis la dernière sauvegarde. Essayez de changer le nom de ce champ et de voir si votre code fonctionne.

+0

Le problème était encore plus bête que ça :) J'avais essayé d'autres noms de champs sans succès. On dirait que mon code était correct - mais mon test était nul –