2010-02-04 5 views
4

ActiveRecord permet d'appeler after_save callback chaque fois que la méthode save est appelée même si le modèle n'a pas été modifié et qu'aucune requête d'insertion/mise à jour n'a été générée.Rails: vérifiez si le modèle a réellement été enregistré dans after_save

C'est en fait le comportement par défaut. Et c'est ok dans la plupart des cas.

Mais certains des callbacks after_save sont sensibles à la chose que si le modèle a été réellement enregistré ou non.

Existe-t-il un moyen de déterminer si le modèle a été enregistré dans l'after_save?

Je courais le code de test suivant:

class Stage < ActiveRecord::Base 
    after_save do 
    pp changes 
    end 
end 

s = Stage.first 
s.name = "q1" 
s.save! 
+0

pas très claire question pour moi .. tu ne peux pas vérifier model.new_record? ? –

+0

after_save? inutile ... toujours faux. –

Répondre

6

ActiveRecord utiliser pour appeler after_save rappel à chaque méthode d'enregistrement est appelé même si le modèle n'a pas été modifiée et aucune insertion/mise à jour requête engendré. ActiveRecord exécute: after_save callbacks chaque fois que l'enregistrement a été enregistré avec succès, quelle que soit sa modification.

# record invalid, after_save not triggered 
Record.new.save 

# record valid, after_save triggered 
r = Record.new(:attr => value) 

# record valid and not changed, after_save triggered 
r.save 

Ce que vous voulez savoir est si l'enregistrement est modifié, pas si l'enregistrement est enregistré. Vous pouvez facilement y parvenir en utilisant record.changed?

class Record 

    after_save :do_something_if_changed 

    protected 

    def do_something_if_changed 
    if changed? 
     # ... 
    end 
    end 
end 
+1

changé? toujours faux après la sauvegarde! –

+0

Avez-vous essayé? L'état "changed?" doit être réinitialisé après l'exécution du dernier callback "after_save". –

+0

Oui, avec ActiveRecord 2.3.4 –

3

Après un enregistrement, vérifiez si l'objet enregistré est un nouvel objet

a = ModelName.new 
a.id = 1 
a.save 
a.new_record? 
#=> false 
Questions connexes