Ich versuche, eine Getter-Methode für ein ActiveRecord-Modell zu überschreiben. Ich habe ein Attribut name
im Modell Category
und möchte in der Lage sein, so etwas zu tun:
def name
name_trans || name
end
Wenn das name_trans
Attribut nicht Null ist, geben Sie es zurück, andernfalls geben Sie das name
Attribut zurück. Wie würde ich das machen?
Dies sollte dann normalerweise so genannt werden:
@category.name
ruby-on-rails
ruby
rails-activerecord
getter-setter
oyvindhauge
quelle
quelle
Update: Die bevorzugte Methode gemäß dem Rails Style Guide ist die Verwendung
self[:name]
anstelle vonread_attribute
undwrite_attribute
. Ich würde Sie ermutigen, meine Antwort zu überspringen und stattdessen diese zu bevorzugen .Sie können dies genau so tun, außer dass Sie
read_attribute
den Wert des Attributs name tatsächlich abrufen und den rekursiven Aufruf dername
Methode vermeiden müssen :quelle
self[:name]
überread_attribute[:name]
?Ich möchte eine weitere Option zum Überschreiben der Getter-Methode hinzufügen, die einfach: super ist.
Dies funktioniert nicht nur bei Attribut-Getter-Methoden, sondern auch bei Assoziations-Getter-Methoden (auch)
quelle
Das Überschreiben und Verwenden von Getter
read_attribute
funktioniert nicht für Assoziationen, aber Sie können esalias_method_chain
stattdessen verwenden.quelle
name
das Modellobjekt aufrufe, welches wird aufgerufen -name_with_override
odername_without_override
?name
werde jetzt anrufenname_with_override
. Wenn Sie aus irgendeinem Grund die ursprüngliche Methode aufrufen möchten, können Sie sie aufrufenname_without_override
.Wenn Sie solche Speicherattribute verwenden
oder mit Edelsteinen wie
hstore_accessor
Edelstein LinkSie haben also die
store
Methode für das Modell verwendet. Um die Methode zu überschreiben, die Sie nicht verwenden könnenself.read_attribute
, müssen Sie stattdessensuper
Folgendes verwenden:quelle
Wenn jemand den Wert nach der
name_trans
Getter-Methode aktualisieren möchte , können Sie self [: name] = verwenden.quelle
Sie können die Rails-Methode read_attribute verwenden. Rails docs
quelle