Ruby on Rails ajouter une fonctionnalité pour modéliser le changement de la propriété
-
19-09-2019 - |
Question
Dans mon modèle rails, j'ai une propriété décimale appelée employer_wcb. Je voudrais que, quand employer_wcb a été changé, un peu sale a été définie sur true. Je voudrais passer outre la méthode setter de employer_wcb. De toute façon de le faire (en particulier à l'aide metaprogramming)?
La solution
En fait, comme des rails v2.1, ce qui a été cuit dans Rails. Jetez un oeil à la pour ActiveRecord :: sale . En résumé:
# Create a new Thing model instance;
# Dirty bit should be unset...
t = Thing.new
t.changed? # => false
t.employer_wcb_changed? # => false
# Now set the attribute and note the dirty bits.
t.employer_wcb = 0.525
t.changed? # => true
t.employer_wcb_changed? # => true
t.id_changed? # => false
# The dirty bit goes away when you save changes.
t.save
t.changed? # => false
t.employer_wcb_changed? # => false
Autres conseils
Si vous ne souhaitez pas utiliser une fonctionnalité intégrée de bit sale de rail (dire que vous voulez remplacer pour d'autres raisons) vous ne pouvez pas utiliser la méthode d'alias (voir mes commentaires sur l'entrée de Steve ci-dessus). Vous pouvez cependant utiliser des appels à super pour le faire fonctionner.
def employer_wcb=(val)
# Set the dirty bit to true
dirty = true
super val
end
Cela fonctionne très bien.