ruby on rails - proyecto - ¿Qué rol tienen los constructores de modelos ActiveRecord en Rails(si los hay)?
primeros pasos ruby on rails (3)
Acabo de leer esta pregunta, que trata de dar un valor predeterminado al campo de fecha de un modelo ActiveRecord. La respuesta aceptada muestra cómo establecer el valor predeterminado desde el controlador. En mi opinión, este tipo de lógica de negocios realmente pertenece al propio modelo.
Luego me puse a pensar cómo si esto fuera Java, probablemente establecería el valor del campo inicial al declarar la variable de instancia o dentro del constructor. Dado que los campos respaldados por bases de datos no tienen que declararse explícitamente en los modelos de ActiveRecord, ¿es esto algo para lo que podría usar el método de initialize
del modelo? Tengo curiosidad porque realmente no he visto mucho uso de constructores para modelos ActiveRecord dentro del código de Rails que he visto. ¿Tienen un papel que desempeñar y, si es así, cuál es?
Hago esto muy a menudo en realidad para los valores por defecto. Funciona bien y todavía permite al usuario cambiarlo. Recuerde, el método de inicialización se llama cuando dice MyObject.new
. Sin embargo, es posible que desee leer esta entrada de blog (aunque un poco desactualizada) sobre el uso de la initialize
.
Debe usar after_initialize
lugar de initialize
. ActiveRecord :: Base requiere el método de inicialización para preparar muchos de los métodos de conveniencia. Si se define un método after_initialize
en su modelo, se le llama como una devolución de llamada para nuevos, crear, encontrar y cualquier otro método que genere instancias de su modelo.
Idealmente querrías definirlo así:
def after_initialize
@attribute ||= default_value
end
Además, tenga en cuenta que no puede usar esta devolución de llamada como las demás, debe definir un método denominado after_initialize (como arriba) para que funcione. No puedes hacer lo siguiente:
after_initialize :run_some_other_method
La respuesta de @TopherFangio es correcta. Parece que la API ActiveRecord cambió algún tiempo entre su respuesta (2009) y ahora (2015).
A partir de hoy (Rails 4 with ActiveRecord 4.2.0), aquí se explica cómo agregar inicializadores de acuerdo con los documentos de ActiveRecord :
class Widget < ActiveRecord::Base
after_initialize |new_widget|
new_widget.name ||= ''Unnamed Widget''
end
end
Puede verificar con sentencias de objetos o inspeccionando el nuevo objeto desde la rails console
que realmente se inicialice correctamente.
Según este blog , el registro activo no siempre usa lo nuevo, por lo que es posible que no se llame a la inicialización en su objeto.