Dans mon modèle de rails, j'ai une propriété décimale appelée employeur_wcb. Je voudrais que si, quand employeur_wcb a été changé, un bit sale a été mis à true. Je souhaite remplacer la méthode setter employeur_wcb. Tout moyen de le faire (en particulier en utilisant la métaprogrammation)?ruby on rails ajoute des fonctionnalités pour modifier les propriétés du modèle
2
A
Répondre
8
Donc en réalité, à partir de Rails v2.1, cela a été cuit dans Rails. Jetez un oeil à la documentation for ActiveRecord::Dirty. 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
2
Si vous ne souhaitez pas utiliser une fonctionnalité intégrée de bit sale de rail (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.
+0
Nice! C'est tellement plus élégant que l'alias! –
Absolument. Deux mises en garde cependant: Nous ne savons pas quelle version de Rails est ciblée (probablement pas un problème mais bon!) Et je ne crois pas que ActiveRecord :: Dirty piste les attributs virtuels. Asker n'a pas précisé la nature de l'attribut employeur_wcb. –
+1 - @Daniel: Ceci est la meilleure réponse à accepter si vous utilisez> 2.1 et que l'attribut "employeur" n'est pas un attribut virtuel. –
ActiveRecord :: Dirty était un plugin avant d'être accepté dans 2.1. http://code.bitsweat.net/svn/dirty/ – EmFi