Estoy tratando de sobrescribir un método getter para un modelo ActiveRecord. Tengo un atributo llamado name
en el modelo Category
y me gustaría poder hacer algo como esto:
def name
name_trans || name
end
Si el name_trans
atributo no es nulo, devuélvalo; de lo contrario, devuelva el name
atributo. ¿Cómo haría esto?
Esto debería llamarse normalmente así:
@category.name
ruby-on-rails
ruby
rails-activerecord
getter-setter
Oyvindhauge
fuente
fuente
Actualización: el método preferido de acuerdo con la Guía de estilo de Rails es usar en
self[:name]
lugar deread_attribute
ywrite_attribute
. Te animo a que omitas mi respuesta y prefieras esta .Puede hacerlo exactamente así, excepto que debe usarlo
read_attribute
para recuperar el valor del atributo de nombre y evitar la llamada recursiva alname
método:fuente
self[:name]
másread_attribute[:name]
?Me gustaría agregar otra opción para sobrescribir el método getter, que es simplemente: super.
esto no solo funciona en el método getter de atributos, sino también en los métodos getter de asociaciones, también。
fuente
Anular el getter y usar
read_attribute
no funciona para asociaciones, pero puede usaralias_method_chain
en su lugar.fuente
name
el objeto modelo, ¿cuál se llamaráname_with_override
oname_without_override
?name
ahora llamaráname_with_override
. Si desea llamar al método original por alguna razón, puede llamarname_without_override
.Si usa atributos de tienda como este
o usando gemas como
hstore_accessor
enlace de gemasAsí que terminó usando el
store
método en el modelo, luego, para anular esos métodos que no puede usarself.read_attribute
, debe usar en su lugarsuper
así:fuente
Si alguien quiere actualizar el valor después del
name_trans
método getter, puede usar self [: name] =.fuente
Puede utilizar el método read_attribute de Rails. Documentos de rieles
fuente