2009-12-15 3 views
2

Dans les rails, nous pouvons accéder à la colonne db via les rails d'attributs fournis, mais pouvons-nous changer cela? par exemple J'ai DB avec colonne de nom que je pourrais mettre en œuvre quelque chose comme. Je l'ai essayé, mais il en résulte un débordement de la pile. Il y a un moyen d'accomplir cela.Puis-je implémenter un setter et un getter de rails pour les attributs des colonnes db

plus de question, Y at-il une différence entre name et self.name.

+2

Re sulté dans StackOverflow en effet. – Parziphal

Répondre

7
def name 
    "sir" + read_attribute(:name) 
end 

Mais évitez cette pratique. Utilisez plutôt un getter/setter supplémentaire, également appelé "attribut virtuel". Pour plus d'informations, lire cette réponse: decorating an attribute in rails

Dans votre cas, il existe également un effet secondaire étrange. Chaque fois que l'on accède à l'attribut, il ajoute le nom. Après 3 appels, vous vous retrouvez avec

"sir sir sir name" 

En effet, vous pouvez faire

def name 
    n = read_attribute(:name) 
    if /^sir/.match(name) 
    n 
    else 
    "sir #{n}" 
    end 
end 

mais, sérieusement, ne pas le faire.

+0

Je suis d'accord que l'ajout d'une méthode nom_format est la voie à suivre, par le lien. Ne plaisante pas avec le nom de l'attribut, ça n'en vaut pas la peine. – MattMcKnight

2

Si vous êtes au courant des complications possibles, mais ont encore besoin de le faire, alors:

def name 
    "sir" + self[:name] 
end 
+0

Est-ce que self [: name] et read_attributes [: name] font la différence? – sarunw

+0

il est juste une main courte, voir "écrasement des accesseurs par défaut" à http://api.rubyonrails.org/classes/ActiveRecord/Base.html –

0

Utilisez super

Ruby Overriding methods

Il a beaucoup d'explications, mais je pense c'est aussi simple que d'appeler la méthode déjà définie

def name 
    "sir #{super}" 
end 
Questions connexes