Inicializar un objeto, ó buscando el constructor

Hola gente,

Me estoy volviendo loco intentando encontrar el lugar dónde se
inicializan los atributos de un objeto.

He encontrado esto:

http://www.ruby-forum.com/topic/74160

Pero no me puedo creer que tenga que poner algo como esto:
#constructor
def initialize( *args, &block )
super
self.atributo = “valor inicial”
end

Para simular un constructor.

No digo que no esté acostumbrado a este tipo de sobreescrituras de
constructor, pero es sumamente delicado porque tengo que saber el
número y tipo de argumentos que el initialize de la clase padre
requiere y me parece un poco frágil la
solución.
He encontrado que hay un callback llamado “after_initialize” pero no
funciona con el new… parece ser que sólo se invoca al invocar al
“finder”:

El caso es que no sé dónde inicializar atributos con valores por
defecto cuando el objeto se crea por primera vez.

He empezado usando el before_validation. Pero no me sirve porque este
método se invoca múltiples veces y sólo quiero que los valores por
defecto se asignen una vez.

Seguro que hay algo que se me escapa, quizás no estoy buscando donde
debería.

Alguna ayuda?

Gracias
f.

El 25/03/08, Fernando G. [email protected]
escribió:> #constructor

requiere y me parece un poco frágil la solución.

Cuando llamás al super sin argumentos, Ruby envía de igual forma los
parámetros al padre de acuerdo a los parámetros del método.

De Programming Ruby: The Pragmatic Programmer's Guide

“The trick here is the Ruby keyword ``super’'. When you invoke super
with no arguments, Ruby sends a message to the current object’s
parent, asking it to invoke a method of the same name as the current
method, and passing it the parameters that were passed to the current
method.”

Probalo!
Silvio

He empezado usando el before_validation. Pero no me sirve porque este
método se invoca múltiples veces y sólo quiero que los valores por
defecto se asignen una vez.

Seguro que hay algo que se me escapa, quizás no estoy buscando donde debería.

Alguna ayuda?

Gracias
f.

Acá no puedo ayudarte.

El 26/03/08, Silvio Q. [email protected]
escribió:> > constructor, pero es sumamente delicado porque tengo que saber el

número y tipo de argumentos que el initialize de la clase padre
requiere y me parece un poco frágil la solución.

Cuando llamás al super sin argumentos, Ruby envía de igual forma los
parámetros al padre de acuerdo a los parámetros del método.

Gracias…

Aún así no sé si he encontrado el punto donde se deben inicializar los
valores por defecto de los atributos.

¿Alguna sugerencia?

Gracias
f.

2008/3/25 Fernando G. [email protected]:

He encontrado que hay un callback llamado “after_initialize” pero no
funciona con el new… parece ser que sólo se invoca al invocar al
“finder”:

Mira este ejemplo usando after_initialize:

class Order < ActiveRecord::Base
def after_initialize
self.order_type = 3
end
end
=> nil
o = Order.new
=> #<Order id: nil, order_type: 3, tax_table_id: nil, created_at: nil,
updated_at: nil>

¿Podría ser esto lo que buscas? Creería que es justo antes de este
punto donde se establecen por valores por defecto pero no estoy seguro
de eso.

El 26/03/08, Fernando G. [email protected]
escribió:> >

¿Podría ser esto lo que buscas? Creería que es justo antes de este
punto donde se establecen por valores por defecto pero no estoy seguro
de eso.

Hay que ayudarse del self.new_record? para evitar que los atributos
vuelvan a sus valores por defecto cada vez que se cargue una instancia
usando .find o cualquier cosa.

Saludos
f.

2008/3/26, Federico B. [email protected]:

def after_initialize
de eso.
Jobar¡… claro¡ es lo que buscaba… es que estaba intentando invocarlo
con callbacks del tipo:

after_initialize :initialize_status

Y no funciona… hay que declarar el callback en formato método.

Gracias.
f.