2009-12-15 16 views

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 
+0

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. –

+0

+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. –

+0

ActiveRecord :: Dirty était un plugin avant d'être accepté dans 2.1. http://code.bitsweat.net/svn/dirty/ – EmFi

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! –