Estoy tratando de sobrescribir un método getter para un modelo ActiveRecord. Tengo un atributo llamado nameen el modelo Categoryy me gustaría poder hacer algo como esto:
def name
name_trans || name
end
Si el name_transatributo no es nulo, devuélvalo; de lo contrario, devuelva el nameatributo. ¿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_attributeywrite_attribute. Te animo a que omitas mi respuesta y prefieras esta .Puede hacerlo exactamente así, excepto que debe usarlo
read_attributepara recuperar el valor del atributo de nombre y evitar la llamada recursiva alnamemé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_attributeno funciona para asociaciones, pero puede usaralias_method_chainen su lugar.fuente
nameel objeto modelo, ¿cuál se llamaráname_with_overrideoname_without_override?nameahora 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_accessorenlace de gemasAsí que terminó usando el
storemétodo en el modelo, luego, para anular esos métodos que no puede usarself.read_attribute, debe usar en su lugarsuperasí:fuente
Si alguien quiere actualizar el valor después del
name_transmétodo getter, puede usar self [: name] =.fuente
Puede utilizar el método read_attribute de Rails. Documentos de rieles
fuente