web-dev-qa-db-fra.com

Remplacer les méthodes d'attribut ActiveRecord

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?

147
Require This

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
208
Aaron Longwell

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
91
mipadi

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.

7
jcnnghm