Perché non è sempre necessario il sé in ruby ​​/ rails / activerecord?

Nel testare una coppia getter / setter in un modello di rotaie, ho trovato un buon esempio di comportamento che ho sempre pensato strano e incoerente.

In questo esempio ho a che fare con la class Folder < ActiveRecord::Base .

Folder belongs_to :parent, :class_name => 'Folder'

Nel metodo getter, se utilizzo:

 def parent_name parent.name end 

…o…

 def parent_name self.parent.name end 

… il risultato è esattamente lo stesso, ottengo il nome della cartella genitore. Tuttavia, nel metodo getter se uso …

 def parent_name=(name) parent = self.class.find_by_name(name) end 

… il genitore diventa nulla, ma se uso …

 def parent_name=(name) self.parent = self.class.find_by_name(name) end 

… poi poi funziona.

Quindi, la mia domanda è, perché è necessario dichiarare self.method a volte e perché si può semplicemente usare una variabile locale?

Sembra che la necessità / l’uso di self in ActiveRecord sia incoerente, e mi piacerebbe capirlo meglio così non mi sento come se indovinassi sempre se ho bisogno di dichiararmi o meno. Quando dovresti / non dovresti usare da solo nei modelli ActiveRecord?

Questo perché attributi / associazioni sono in realtà metodi (getter / setter) e non variabili locali. Quando si indica “genitore = valore”, Ruby assume che si desidera assegnare il valore alla variabile locale padre.

Da qualche parte in cima allo stack c’è un metodo setter “def parent =” e per chiamare devi usare “self.parent =” per dire a Ruby che in realtà vuoi chiamare un setter e non solo impostare una variabile locale.

Quando si tratta di getter, Ruby cerca di vedere se c’è una variabile locale prima e se non riesce a trovarla prova a trovare un metodo con lo stesso nome, motivo per cui il metodo getter funziona senza “sé”.

In altre parole, non è colpa di Rails, ma è il modo in cui Ruby funziona intrinsecamente.

Spero possa aiutare.