Kann ich Schienen Setter und Getter für Attribute für db Spalten implementieren
-
19-09-2019 - |
Frage
In Schienen wir db Spalte durch Attribute zugreifen können Schienen, aber können wir das ändern? Zum Beispiel habe ich db mit Namensspalte so etwas wie ich implementieren könnte.
def name
"sir" + name
end
Ich versuchte es, aber es ergibt sich in Stapelüberlauf. Es gibt einen Weg, dies zu erreichen.
mehr Frage, Gibt es einen Unterschied zwischen Namen und self.name.
Lösung
def name
"sir" + read_attribute(:name)
end
Aber vermeiden Sie diese Praxis. Verwenden Sie einen zusätzliches Getter / Setter statt, die auch als „virtuelles Attribut“ bekannt. Für weitere Informationen lesen Sie diese Antwort: ein Attribut in Schienen Dekoration
In Ihrem Fall gibt es auch eine seltsame Nebenwirkung. Jedes Mal wenn das Attribut zugegriffen wird, fügt er den Namen. Nach 3 Anrufen, Sie am Ende mit
"sir sir sir name"
Tatsächlich können Sie tun,
def name
n = read_attribute(:name)
if /^sir/.match(name)
n
else
"sir #{n}"
end
end
aber, im Ernst, dies nicht tun.
Andere Tipps
Wenn Sie sich bewusst über die möglichen Komplikationen, müssen aber nach wie vor, dies zu tun, dann:
def name
"sir" + self[:name]
end
Verwenden super
Ruby-Überschreiben von Methoden
Es hat eine Menge zu erklären, aber ich denke, dass es so einfach ist, das Verfahren als Aufruf, die bereits definiert sind
def name
"sir #{super}"
end