Un exemple de ce dont je parle:
class Person < ActiveRecord::Base
def name=(name)
super(name.capitalize)
end
def name
super().downcase # not sure why you'd do this; this is just an example
end
end
Cela semble fonctionner, mais je viens de lire la section sur la redéfinition des méthodes d'attribut dans ActiveRecord :: Base docs , et suggère d'utiliser le read_attribute
et write_attribute
méthodes. Je pensais qu'il devait y avoir quelque chose qui n'allait pas dans ce que je fais dans l'exemple ci-dessus; sinon, pourquoi béniraient-ils ces méthodes comme étant la "bonne façon" de remplacer les méthodes d'attribut? Ils forcent également un langage beaucoup plus laid, il doit donc y avoir une bonne raison ...
Ma vraie question: y at-il quelque chose qui cloche dans cet exemple?
En écho aux commentaires de Gareth ... votre code ne fonctionnera pas tel qu'écrit. Il devrait être réécrit de cette façon:
def name=(name)
write_attribute(:name, name.capitalize)
end
def name
read_attribute(:name).downcase # No test for nil?
end
En tant qu'extension de la réponse d'Aaron Longwell, vous pouvez également utiliser une "notation de hachage" pour accéder aux attributs qui ont substitué des accesseurs et des mutateurs:
def name=(name)
self[:name] = name.capitalize
end
def name
self[:name].downcase
end
Il existe d'excellentes informations sur ce sujet à l'adresse http://errtheblog.com/posts/18-accessor-missing .
En bref, ActiveRecord gère correctement les super-appels pour les accesseurs d'attribut ActiveRecord.