ruby-on-rails - attr_accessor ruby
¿Cómo puedo sobrescribir un método getter en un modelo ActiveRecord? (7)
Actualización: El método preferido de acuerdo con la Guía de estilo de Rails es usar self[:name] lugar de read_attribute y write_attribute . Te animo a omitir mi respuesta y, en cambio, prefiero esta .
Puede hacerlo exactamente así, excepto que necesita usar read_attribute para obtener realmente el valor del atributo de nombre y evitar la llamada recursiva al método de name :
def name
name_trans || read_attribute(:name)
end
Estoy intentando sobrescribir un método getter para un modelo ActiveRecord. Tengo un atributo llamado name en la Category modelo, y me gustaría poder hacer algo como esto:
def name
name_trans || name
end
Si el atributo name_trans no es nulo, devuélvalo, de lo contrario, devuelva el atributo de name . ¿Cómo haría esto?
Esto debería llamarse normalmente así:
@category.name
Anular el getter y usar read_attribute no funciona para las asociaciones, pero puede usar alias_method_chain en alias_method_chain lugar.
def name_with_override
name_trans || name_without_override
end
alias_method_chain :name, :override
La Guía de estilo de Rails recomienda usar self[:attr] sobre read_attribute(:attr) .
Puedes usarlo así:
def name
name_trans || self[:name]
end
Me gustaría agregar otra opción para sobrescribir el método getter, que es simplemente: super.
def name
name_trans || super
end
esto funciona no solo en el método getter de atributos, sino también en los métodos getters de asociaciones.
Puede usar el método Rails read_attribute. Documentos de rieles
Si alguien quiere actualizar el valor después de name_trans en el método getter, puede usar self [: name] =.
def name
self[:name] = name_trans || self[:name]
# don''t do this, it will cause endless loop
# update(name: name_trans)
end
Si usa atributos de tienda como este
store :settings, accessors: [:volume_adjustment]
o usando gemas como hstore_accessor gem link
Así que terminaste usando el método store en el modelo, luego para anular el método que no puedes usar self.read_attribute , debes usar en su lugar super así:
def partner_percentage
super.to_i || 10
end