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