Un ejemplo de lo que estoy hablando:
class Person < ActiveRecord::Base
def name=(name)
super(name.capitalize)
end
def name
super().downcase # not sure why you'd do this; this is just an example
end
end
Esto parece funcionar, pero acabo de leer la sección sobre la anulación de los métodos de atributo en los documentos ActiveRecord :: Base , y sugiere usar los métodos read_attribute
y write_attribute
. Pensé que debe haber algo mal con lo que estoy haciendo en el ejemplo anterior; de lo contrario, ¿por qué bendecirían estos métodos como la "forma correcta" de anular los métodos de atributos? También están forzando un idioma mucho más feo, por lo que debe haber una buena razón ...
Mi verdadera pregunta: ¿Hay algo mal con este ejemplo?
ruby-on-rails
oop
activerecord
Ajedi32
fuente
fuente
Como una extensión de la respuesta de Aaron Longwell, también puede usar una "notación hash" para acceder a los atributos que han anulado los accesores y mutadores:
fuente
self.attribute
vuela la pila en 3.2.16.||=
con el incumplimiento:def name; self[:name] ||= 'anon'; end
Hay gran información disponible sobre este tema en http://errtheblog.com/posts/18-accessor-missing .
En resumen, ActiveRecord maneja correctamente las llamadas súper para los accesores de atributos de ActiveRecord.
fuente
Tengo un complemento de rieles que hace que la anulación de atributos funcione con super como es de esperar. Lo puedes encontrar en github .
Instalar:
Usar:
Una vez que hayas hecho eso, las cosas simplemente funcionan:
fuente