Remplacer les méthodes d’atsortingbut 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 j’ai juste lu la section sur la substitution des méthodes d’atsortingbuts dans les documents ActiveRecord :: Base , et elle suggère d’utiliser les méthodes read_atsortingbute et write_atsortingbute . J’ai pensé qu’il devait y avoir quelque chose qui ne va pas dans ce que je fais dans l’exemple ci-dessus. sinon, pourquoi béniraient-ils ces méthodes comme étant la “bonne manière” de remplacer les méthodes d’atsortingbut? Ils forcent aussi un idiome beaucoup plus laid, donc il doit y avoir une bonne raison …

Ma vraie question: y a-t-il quelque chose qui ne va pas dans cet exemple?

Faisant écho aux commentaires de Gareth, votre code ne fonctionnera pas comme il est écrit. Il devrait être réécrit de cette façon:

 def name=(name) write_atsortingbute(:name, name.capitalize) end def name read_atsortingbute(: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 atsortingbuts qui ont remplacé les accesseurs et les mutateurs:

 def name=(name) self[:name] = name.capitalize end def name self[:name].downcase end 

De nombreuses informations sont disponibles 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’atsortingbuts ActiveRecord.

J’ai un plug-in de rails qui fait que le super-atsortingbut fonctionne avec super comme on peut s’y attendre. Vous pouvez le trouver sur github .

À installer:

 ./script/plugin install git://github.com/chriseppstein/has_overrides.git 

Utiliser:

 class Post < ActiveRecord::Base has_overrides module Overrides # put your getter and setter overrides in this module. def title=(t) super(t.titleize) end end end 

Une fois que vous avez fait cela, les choses fonctionnent:

 $ ./script/console Loading development environment (Rails 2.3.2) >> post = Post.new(:title => "a simple title") => # >> post.title = "another simple title" => "another simple title" >> post.title => "Another Simple Title" >> post.update_atsortingbutes(:title => "updated title") => true >> post.title => "Updated Title" >> post.update_atsortingbute(:title, "singly updated title") => true >> post.title => "Singly Updated Title"