Manejo de Default Values en Active Record


#1

Los Default Values del objeto Active Record, los debo manejar en el
callback after_initialize ? :

class Producto < ActiveRecord::Base

protected

def after_initialize
self.costo = 0.0 unless self.costo
end

end

Entiendo que la manera más correcta es manejarlo en el modelo estás
cuestiones, pero tengo una duda, al invocar Producto.find(:all), este
método se estará llamando por cada fila que recupera desde la base de
datos ?. Me gustaría manejarlo así, pero por motivos de optimización es
recomendable manejarlo en el controlador en Producto.new ? Qué opinan ?

Saludos.

Jaime Mora R.


#2

On 5/10/07, Jaime Mora R. removed_email_address@domain.invalid
wrote:

Para sólo actualizarlos cuando se crean los objetos puedes utilizar
before_validation_on_create o before_create (o before_validation y
before_save, depende de lo que quieras).

Muchos callbacks disponibles están documentados en
http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html (y en
esa página explican que cada vez que se encuentra un modelo con find
se llamaría a ese método after_initialize).


#3

On 5/9/07, Jaime Mora R. removed_email_address@domain.invalid wrote:

Los Default Values del objeto Active Record, los debo manejar en el
callback after_initialize ? :

Creo que la manera más correcta es hacerlo en la inicialización del objeto.

Además de ser más “prolijo”, te va a dar la ventaja de, por ejemplo,
que los controles se llenen automáticamente en el formulario de
creación.
class Producto < ActiveRecord::Base
def initialize
super

self.costo ||= 0.0
self.pais ||= Pais.find(:first)

end
end

etc…

Saludos!


#4

Daniel R. Troitiño wrote:

On 5/10/07, Jaime Mora R. removed_email_address@domain.invalid
wrote:

Para só¬¯ actualizarlos cuando se crean los objetos puedes utilizar
before_validation_on_create o before_create (o before_validation y
before_save, depende de lo que quieras).

Me refiero cuando se invoca la acción new. Es más conveniente (por
motivos de optimización) manejar los default values en el controlador ?
:

def new
@producto = Producto.new
@producto.costo = 0.0
end

Posiblemente sea la forma más conveniente pero no la más correcta.
Necesito saber cómo maneja Rails las llamadas a initialize ó bien
after_initialize en el modelo, porque sospecho que al ejecutar
Producto.find(:all), y si recupera 1000 objetos producto, estos métodos
se estarán ejecutando 1000 veces con una posible carga de ejecución.
Ustedes cómo manejan los default values ?. En que situaciones utilizan
initialize y en que otras after_initialize ?

Saludos.

Jaime Mora R.


#5

On 5/10/07, Jaime Mora R. removed_email_address@domain.invalid
wrote:

Solo por aclarar:
Los controles si que se llenan, al asignar los valores en
after_initialize.

Jaime, gracias por la
aclaración.
Igual fijate que de la forma que te lo escribí, hace:

self.costo ||= 0.0

La asignación nunca ocurre.

Lo que ocurre es una comparación (si self.costo es nil)

Estaría bueno hacer una prueba y ver si vale la pena o no incurrir en
el costo de performance… (yo supongo que sí, por la separación de
MVC y para tener un modelo de datos fuerte, recordá “thin controllers,
fat models”)


#6

Damian J. wrote:

Ademá³ de ser má³ “prolijo”, te va a dar la ventaja de, por ejemplo,
que los controles se llenen automá´©camente en el formulario de

Solo por aclarar:
Los controles si que se llenan, al asignar los valores en
after_initialize.

Saludos

Jaime Mora R.