Model to model

buenas noches.

me hacen el favor y me dicen como hago cuando tengo dos modelos igualesy
quiero pasar un registro del uno al otro, algo asi:

modelo1 = Modelo1.new
modelo1 = modelo2

por ahora lo hago asi:

modelo1.campo1 = modelo2.campo1
modelo1.campo2 = modelo2.campo2
modelo1.campon = modelo2.campon

sera que se puede asi:

modelo1 = Modelo1.new(modelo2)

gracias por la ayuda

Si mal no digo podes hacer esto

modelo1 = modelo2.dup

Saludos


Diego L.
Sinai IT
[email protected]

El Jul 15, 2007, a las 2:10 AM, Azulejo A.
escribió:

modelo1.campo2 = modelo2.campo2
modelo1.campon = modelo2.campon

Existe ActiveRecord#clone:

modelo1 = modelo2.clone

con ello modelo1 tiene ID a nil y es un new_record?

– fxn

El Jul 16, 2007, a las 11:08 AM, Moises D. escribió:

con ello modelo1 tiene ID a nil y es un new_record?
class Object
def deep_clone
Marshal::load(Marshal.dump(self))
end
end

Pero ojo que el contexto no es copia de objetos Ruby cualesquiera, se
trata de objetos persistentes.

Con ese deep_clone no se reproduce la estructura en base de datos,
que es algo que uno que copia modelos muy posiblemente quiera. Por
ejemplo, si tienes

class Foo < AR::Base
has_one :bar
end

El clone tendra un bar o no segun si lo tenia leido el original (las
relaciones se cargan on-demand). E incluso si lo tuviera cargado la
foreign key en bar no apunta al clon, sigue apuntando al original
puesto que se copian atributos tal cual. En general uno querria un
bar nuevo apuntando al clon, un registro nuevo al que se han copiado
el resto de atributos. Esto seria asociar un AR#clone de bar al clon.

A su vez, habiendo ejecutado foo.bar nada mas, las asociaciones que
cuelgan de bar estan por leer, de manera que la copia esta no solo
descuadrada en cuanto a la base de datos sino que es de nivel 1 tan
solo.

Sin haberlo escrito creo que un deep clone con esa semantica seria un
metodo recursivo que hiciera reflexion sobre las asociaciones y fuera
contruyendo nuevos objetos con AR#clone para al final grabarlo todo
de una tacada desde el objeto root. Esto suena a plugin :-).

– fxn

Xavier N. wrote:

El Jul 15, 2007, a las 2:10 AM, Azulejo A.
escribi�:
modelo1.campo2 = modelo2.campo2

modelo1.campon = modelo2.campon

Existe ActiveRecord#clone:

modelo1 = modelo2.clone

con ello modelo1 tiene ID a nil y es un new_record?

– fxn

Para copiar un objeto a otro incluyendo “todo” (tener en cuenta que las
relaciones con otros objetos se copian con el clone y no el objeto
relacionado…):

Incluye esto en el enviroment:

class Object
def deep_clone
Marshal::load(Marshal.dump(self))
end
end

Y así puedes hacer

modelo1 = modelo2.deep_clone

Obtendrás un copia completa y no solo referencias.

holas a toda la lista.

realmente lo que quiero es copiar todo un modelo, un solo registro
activo a otro modelo sin que se copie el id, ya que en ambos son campos
autoincrement y la numeracion es lo unico que varia en cada modelo.

gracias.