90 votes

Comment détecter les changements d'attribut de modèle?

Je voudrais créer une fonction de rappel dans les rails qui s'exécute après un modèle est enregistré.

J'ai ce modèle, Revendication qui a un attribut "statut" qui varie en fonction de l'état de la demande, les valeurs possibles sont en attente, approuvé, approuvé, rejeté

La base de données de l'état avec la valeur par défaut de "en attente".

J'aimerais effectuer certaines tâches après le modèle est créé pour la première fois, ou mise à jour d'un état à un autre, selon lequel l'état passant de l'état.

Mon idée est d'avoir une fonction dans le modèle:

    after_save :check_state

    def check_state
      # if status changed from nil to pending (created)
      do this

      # if status changed from pending to approved
      performthistask
     end

Ma question est comment puis-je vérifier pour la valeur précédente avant que le changement dans le modèle?

178voto

Harish Shetty Points 38877

Vous devriez regarder Activerecord::Sale module: Vous devriez être en mesure d'effectuer les actions suivantes sur votre Demande modèle:

  claim.status_changed?  # returns true if 'status' attribute has changed
  claim.status_was       # returns the previous value of 'status' attribute
  claim.status_change    # => ['old value', 'new value'] returns the old and 
                         # new value for 'status' attribute

Oh! les joies de la les Rails!

38voto

zeacuss Points 982

vous pouvez utiliser cette

self.changed

elle retourne un tableau de toutes les colonnes qui a changé dans ce dossier

vous pouvez également utiliser

self.changes

qui retourne la valeur de hachage de colonnes qui ont changé et les résultats avant et après sous la forme de tableaux

4voto

Toby Hede Points 22128

Je vous recommande de jeter un œil à la disposition de l'état de la machine plugins:

Soit on va vous laisser le programme d'installation états et de transitions entre les états. Très utile et facile de manipulation de vos exigences.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X