La comprensión de Ruby on Rails descriptores de acceso modelo ActiveRecord
-
22-09-2019 - |
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.
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.