Forum: Rails-ES model to model

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.
7096a26829c74e9b3a677cf929ee4088?d=identicon&s=25 Azulejo Azulejo (azulejo)
on 2007-07-15 02:10
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
Bc1f15044042a165585eabe83e5ea98f?d=identicon&s=25 Diego Lapiduz (Guest)
on 2007-07-15 02:14
(Received via mailing list)
Si mal no digo podes hacer esto

modelo1 = modelo2.dup

Saludos
_____________________
Diego Lapiduz
Sinai IT
dlap@sinai.com.ar
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (Guest)
on 2007-07-15 11:18
(Received via mailing list)
El Jul 15, 2007, a las 2:10 AM, Azulejo Azulejo
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
C1ddce6691ca0631671c243fa038cbbd?d=identicon&s=25 Moises Deniz (railsgeek)
on 2007-07-16 11:08
Xavier Noria wrote:
> El Jul 15, 2007, a las 2:10 AM, Azulejo Azulejo
>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.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (Guest)
on 2007-07-16 19:28
(Received via mailing list)
El Jul 16, 2007, a las 11:08 AM, Moises Deniz 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
7096a26829c74e9b3a677cf929ee4088?d=identicon&s=25 Azulejo Azulejo (azulejo)
on 2007-07-16 20:01
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.
This topic is locked and can not be replied to.