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)?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top