Pregunta

Mi Modelo "DataFile", tiene un montón de campos que me gustaría conjunto desde fuera del modelo, por ejemplo.

file = DataFile.new
file.owner = 123

Ahora, por lo que yo sé, tendría que hacer un "attr_accessor: campo" en mi modelo, para cada campo que me gustaría modificar desde fuera. Sin embargo, el código anterior funciona muy bien sin tener ningún attr_accessors definidos, fijando el campo propietario a 123. ¿Por qué es eso?

Me esperaba conseguir un "método no definido" error o algo por el estilo.

¿Fue útil?

Solución

Debido ORM Rails utiliza el patrón ActiveRecord, dos métodos se crean automáticamente para cada columna de la base de datos asociada con dicho cuadro: ColumnName y ColumnName = . Esto ocurre "automáticamente" como resultado de su modelo de herencia de ActiveRecord :: Base. Estos métodos se definen utilizando las instalaciones de metaprogramación de rubí y se crean dinámicamente en el momento de la creación de clases.

Para más información en cuanto a exactamente lo que está pasando, me gustaría echar un vistazo a la fuente de Rails. Sin embargo, lo anterior es probablemente suficiente para darle una comprensión de trabajo de lo que está sucediendo.

Otros consejos

Drew y Zepplock lo hizo bien, pero voy a añadir una cosa más. Los descriptores de acceso que los carriles (en realidad, ActiveRecord) crea para los campos de base de datos no son descriptores de acceso de Ruby, y si se utiliza la escritura / consola verá que el propietario no es una variable de instancia del fichero objeto.

Es probable que nunca se daría cuenta de esto hasta que se aventura lejos de los descriptores de acceso estándar y tratar de manipular @owner dentro de un método en el archivo. Si estás aprendiendo Rubí, al mismo tiempo que está aprendiendo rieles (que es lo que hice), lo más probable es que va a chocar con esto en algún momento. Esta es la razón por la que tiene que escribir:

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner = owner << " no longer owns this"
    save
  end
end

en lugar de

class MyClass < ActiveRecord::Base
  def invalidate_owner
    self.owner << " no longer owns this"
    save
  end
end

Lo más probable es "dueño" es parte de su modelo de base de datos. Los descriptores de acceso para los campos de la base se genera automáticamente para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top