text 13 Nov Distinguish database field from method with same name

Non so se vi e` mai capitato… Supponiamo di avere un modello, per esempio News con un campo nel database public_on che indica la data di pubblicazione della news. Ora se quando viene creata la news non viene impostato nessun valore per public_on esso risulta nullo e quindi se chiamiamo my_news.public_on otteniamo nil. E` veramente un pacco ogni volta fare un if per verificare se questo campo non e` nil. Una soluzione e` quella di fare un metodo nel model news.rb come segue:

def public_on
  return self.public_on unless self.public_on.nil?
  return self.created_at
end

Ovviamente pero` eseguendo questo codice otteniamo l’errore stack level too deep in quanto il self.public_on diventa una chiamata ricorsiva e non l’accesso all’attributo.

Per ovviare al problema cambiamo il metodo nel seguente modo:

def public_on
  return self[:public_on] unless self[:public_on].nil?
  return self.created_at
end

Ricordiamoci anche di definire il metodo di assegnazione (=):

def public_on=(val)
  self[:public_on] = val
end

blog comments powered by Disqus