Posso implementare rotaie setter e getter per gli attributi per le colonne db
-
19-09-2019 - |
Domanda
In rotaie possiamo accedere colonna db attraverso attributi rotaie forniti, ma possiamo cambiare questo? per esempio ho DB con colonna nome potrei implementare qualcosa di simile.
def name
"sir" + name
end
ho provato, ma si tradurrà in overflow dello stack. C'è un modo per raggiungere questo obiettivo.
Ancora una domanda, C'è qualche differenza tra il nome e self.name.
Soluzione
def name
"sir" + read_attribute(:name)
end
Ma evitare questa pratica. In alternativa, un getter / setter invece, noto anche come "attributo virtuale". Per maggiori informazioni leggere questa risposta: decorare un attributo in rotaie
Nel tuo caso, c'è anche un effetto collaterale strano. Ogni volta che l'attributo si accede, si aggiunge il nome. Dopo 3 chiamate, si finisce con
"sir sir sir name"
In effetti, si può fare
def name
n = read_attribute(:name)
if /^sir/.match(name)
n
else
"sir #{n}"
end
end
, ma, sul serio, non farlo.
Altri suggerimenti
Se siete a conoscenza di possibili complicazioni, ma ancora bisogno di fare questo, allora:
def name
"sir" + self[:name]
end
Usa super
Ha un sacco di spiegare, ma credo che sia semplice come chiamare il metodo che è già definito
def name
"sir #{super}"
end