Forum: Rails-ES Manejo de Default Values en Active Record

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
8c01355770b98df67a28e5306c5b6502?d=identicon&s=25 Jaime Mora Ramones (moctan)
on 2007-05-10 02:02
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 Ramones
49b6123803e4f327144e991daab62f77?d=identicon&s=25 Daniel Rodriguez Troitiño (Guest)
on 2007-05-10 03:33
(Received via mailing list)
On 5/10/07, Jaime Mora Ramones <ruby-forum-incoming@andreas-s.net>
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/Ca... (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).
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-05-10 15:24
(Received via mailing list)
On 5/9/07, Jaime Mora Ramones <ruby-forum-incoming@andreas-s.net> 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!
8c01355770b98df67a28e5306c5b6502?d=identicon&s=25 Jaime Mora Ramones (moctan)
on 2007-05-10 16:53
Daniel Rodriguez Troitiño wrote:
> On 5/10/07, Jaime Mora Ramones <ruby-forum-incoming@andreas-s.net>
> 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 Ramones
8c01355770b98df67a28e5306c5b6502?d=identicon&s=25 Jaime Mora Ramones (moctan)
on 2007-05-10 17:00
Damian Janowski 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 Ramones
Ffd012d72e7f61639724878825ed25a3?d=identicon&s=25 Damian Janowski (djanowski)
on 2007-05-10 17:34
(Received via mailing list)
On 5/10/07, Jaime Mora Ramones <ruby-forum-incoming@andreas-s.net>
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")
This topic is locked and can not be replied to.