2011-04-11 3 views

Répondre

71

Pour voir si un objet ActiveRecord a changé, vous pouvez appeler:

instance.changed? 

Pour voir si un attribut spécifique a été changé, vous pouvez le faire:

instance.attr_changed? 

où attr est l'attribut vouloir vérifier.

Pour vérifier si un modèle imbriqué changé, vous pouvez simplement faire:

instance.nested_model.changed? 
+3

Merci pour vos réponses! Mais existe-t-il un moyen de vérifier si les attributs d'un modèle imbriqué ont changé sans savoir à l'avance quels sont les modèles imbriqués d'un modèle? – Zabba

+0

Je voudrais vérifier Rails Observers: http://api.rubyonrails.org/classes/ActiveRecord/Observer.html qui pourrait potentiellement informer le modèle parent de la modification. –

+0

Je ne pense pas que les modifications nested_model (association) sont suivies https://rails.lighthouseapp.com/projects/8994/tickets/541-dirty-attributes-with-associations – lulalala

3

Vous pouvez déterminer si un objet a changé, mais pas encore été enregistré en appelant:

my_object.changed? 

Vous pouvez également déterminer si les attributs individuels ont changé (que vous avez un attribut first_name):

my_object.first_name_changed? 

En ce qui concerne les modèles imbriqués, je pense que vous devrez composer le changed? individuellement.

+0

Merci pour vos réponses! Mais est-il possible de vérifier si les attributs d'un modèle imbriqué ont changé sans savoir à l'avance quels modèles imbriqués un modèle a? – Zabba

+0

Je ne pense pas, il y a probablement un wa y pour obtenir une liste de tous les modèles associés, mais je ne le sais pas sur le dessus de ma tête. Comme Mike mentionné ci-dessus, les observateurs peuvent être utiles. Puis-je vous demander ce que vous essayez d'accomplir avec tout cela, car il pourrait y avoir une meilleure solution. –

+0

Merci, C'est ce qu'on appelle la réponse parfaite. –

6

Je sais que c'est une vieille question mais récemment rencontré la même situation.

Vous pouvez obtenir toutes les modifications pour votre modèle imbriqué en utilisant la méthode previous_changes même après avoir enregistré l'objet.

parent_model_object.nested_model_name.previous_changes 

Ceci affichera tous les changements dans le modèle imbriqué avec l'ancienne et la nouvelle valeur.

Questions connexes