tutorial rails programas español ejemplos comandos caracteristicas ruby ruby-on-rails-3 activerecord self

programas - ruby on rails tutorial



¿Por qué el yo no siempre es necesario en ruby/rails/activerecord? (1)

Al probar un par getter / setter en un modelo de rieles, encontré un buen ejemplo de comportamiento que siempre pensé que era extraño e inconsistente.

En este ejemplo, estoy tratando con class Folder < ActiveRecord::Base .

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

En el método getter, si uso:

def parent_name parent.name end

...o...

def parent_name self.parent.name end

... el resultado es exactamente el mismo, obtengo el nombre de la carpeta principal. Sin embargo, en el método getter si uso ...

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

... el padre se vuelve nulo, pero si uso ...

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

... entonces funciona

Entonces, mi pregunta es, ¿por qué necesita declararse a sí mismo a veces y por qué puede simplemente usar una variable local?

Parece que la necesidad / uso de self en ActiveRecord es inconsistente, y me gustaría entender esto mejor así que no siento que siempre estoy adivinando si necesito declararme o no. ¿Cuándo debería / no debería usar uno mismo en los modelos de ActiveRecord?


Esto se debe a que los atributos / asociaciones son en realidad métodos (getters / setters) y no variables locales. Cuando dice "padre = valor", Ruby asume que desea asignar el valor al padre de la variable local.

En algún lugar de la pila hay un método setter "def parent =" y para llamarlo debes usar "self.parent =" para decirle a ruby ​​que realmente quieres llamar a un setter y no solo establecer una variable local.

Cuando se trata de getters, Ruby busca primero si hay una variable local y si no puede encontrarla, trata de encontrar un método con el mismo nombre, por lo que su método get funciona sin "self".

En otras palabras, no es culpa de Rails, pero es la forma en que Ruby funciona inherentemente.

Espero que ayude.