Ruby on Rails añadir funcionalidad al modelo de cambio de propiedad
-
19-09-2019 - |
Pregunta
En mi modelo de rieles, tengo una propiedad llamada decimal employer_wcb. Me gustaría que, cuando se cambió employer_wcb, un poco sucio se establece en true. Me gustaría reemplazar el método employer_wcb colocador. Cualquier forma de hacerlo (en particular, el uso de metaprogramming)?
Solución
Así que en realidad, a partir de rieles v2.1, esto ha sido horneados en los rieles. Echar un vistazo a la de ActiveRecord :: Dirty . En resumen:
# 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
Otros consejos
Si no desea utilizar de ferrocarril construido en la funcionalidad poco sucio (digamos desea reemplazar por otras razones) no se puede utilizar el método de alias (ver mis comentarios sobre la entrada de Steve arriba). Sin embargo, puede utilizar las llamadas a súper para hacer que funcione.
def employer_wcb=(val)
# Set the dirty bit to true
dirty = true
super val
end
Esto funciona muy bien.