2010-09-01 4 views
4

Dans mon application Rails, j'essaie de mettre à jour l'attribut d'un modèle en utilisant update_attribute dans un rappel after_create. Je peux mettre à jour l'attribut avec succès, mais pour une raison quelconque, tous les autres attributs du modèle sont également mis à jour lorsque je le fais. Ainsi, même si l'attribut de nom du modèle (par exemple) n'a pas changé, il est défini (à sa valeur actuelle) dans la requête de mise à jour de la base de données.La mise à jour d'un attribut dans un rappel after create entraîne la mise à jour de l'enregistrement complet

Est-ce le comportement attendu dans Rails (2.3.8), ou je fais quelque chose de mal?

+0

Pouvez-vous poster votre code after_create? –

Répondre

4

Oui je crois que ce comportement est cohérent parce que par exemple de votre modèle qui vient d'être créé n'a pas été rechargées. Par conséquent, les attributs 'modifiés' n'ont pas été réinitialisés.

Désolé si ce n'est pas une explication très claire. Pour démontrer, exécutez le débogueur dans votre méthode after_create. Par exemple.

def my_after_save_callback 
    require 'ruby-debug'; debugger 
    update_attribute(:foo, "bar") 
end 

Ensuite, lorsque le débogueur commence à courir:

p self.changed 

Un tableau de tous les attributs qui ont été modifiés pour cet objet sera retourné. ActiveRecord mettra à jour tous ces attributs la prochaine fois que l'objet sera sauvegardé.

Une façon de contourner cela est de recharger l'objet avant de mettre à jour l'attribut. Cela réinitialisera les attributs 'changed' et seul l'attribut spécifique que vous modifierez sera mis à jour dans la requête SQL.

Espérons que cela a du sens :-)

Questions connexes