attr_accessor ruby-on-rails ruby rails-activerecord getter-setter

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.



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