Comment faire pour déterminer si un champ dans un modèle / modèle imbriqué changé?
Est-il un moyen rapide de savoir si tout d'un modèle de champs ou les champs de ses modèles imbriqués (un.k.un. les associations) a changé?
Vous devez vous connecter pour publier un commentaire.
Pour voir si un ActiveRecord objet a changé, vous pouvez appeler le:
Pour voir si un attribut a été modifié, vous pouvez le faire:
où l'attribut est l'attribut que vous souhaitez vérifier.
Pour vérifier si imbriquée changement de modèle, vous pouvez le faire:
updated_at
de la colonne? Juste curieux, car après l'enregistrement n'est pas que de la colonne de mise à jour à la date actuelle surinstance.save
indépendamment de savoir si quelque chose a changé, et, par conséquent, est marqué comme changé?has_many
relation qu'elle sera un tableau et que vous avez à faire:@message.groups.any? { |g| g.changed? }
ou@message.groups.any?(&:changed?)
pour vérifier les groupes associés a été changé. Pourhas_one
etbelongs_to
faire comme le post dit.changed?
n'est pas de travail dans ma 5.2 application, qui travaille maintenant avec@message.groups.any?(&:saved_changes)
, c'est si l'utilisation de `has_many'Je sais que c'est une vieille question, mais récemment tombé sur une même situation.
Vous pouvez obtenir toutes les modifications de votre imbriquée à l'aide du modèle de
previous_changes
méthode, même après l'enregistrement de l'objet.Ce sera la liste de tous les changements dans le modèle imbriqué avec la vieille et la nouvelle valeur.
Vous pouvez déterminer si un objet a changé, mais pas encore été enregistrés en appelant le:
Vous pouvez également déterminer si des attributs individuels ont changé (disons que vous avez un
first_name
attribut):Aussi loin que les modèles imbriqués aller, je pense que vous auriez du appeler
changed?
sur chacune d'entre elles.avec 5.1 + la suivante fonctionne pour moi:
saved_changes?
vous permettra de savoir si votre objet a changé:saved_changes
vous permettra de savoir quels champs changé, la valeur avant et l'après de la valeur pour chaque champ: