2009-08-11 16 views
36

Ho un modello Foo con attributi id, name, location. devo un'istanza di Foo:Copia istanze del modello in Rails

f1 = Foo.new 
f1.name = "Bar" 
f1.location = "Foo York" 
f1.save 

Vorrei copiare f1 e da quella copia, creare un'altra istanza del modello Foo, ma non voglio f1.id a riportare a f2.id (I don' t voglio assegnarlo esplicitamente, voglio che il db lo gestisca, come dovrebbe).

C'è un modo semplice per farlo, oltre alla copia manuale di ciascun attributo? Qualsiasi funzione incorporata o la scrittura di uno sarebbe la strada migliore?

Grazie

+0

Finora ho creato un metodo .copy per il modello specifico, vale a dire: F2 = f1.copy f2.name = "Baz" f2.save ancora cercando soluzioni diverse – user94154

risposta

58

Questo è ciò che ActiveRecord::Base#clone metodo è per:

@bar = @foo.clone 

@bar.save 
+75

Utilizzare @ foo.dup ora per le guide 3.1 e successive. Clone copia l'id. – Ultimation

2

un torto modo per fare questo sarebbe:

f2 = Foo.new(f1.attributes)  # wrong! 
f2.save       # wrong! 

o in una sola riga, ma ancora sbagliato:

f2 = Foo.create(f1.attributes) # wrong! 

vedere i commenti per i dettagli

+0

si vince per essere stato prima. MOLTE grazie per l'aiuto a tutti e due !!! Genio! – user94154

+7

QUESTO NON FUNZIONERÀ! tutti gli attributi che non sono in attr_accessible o che sono in attr_protected andranno persi! o se si sta utilizzando uno dei plugin di protezione degli attributi si verificherà un'eccezione generata! –

+3

Non solo, tutti gli ID sono ancora gli stessi, quindi salvare eseguirà solo un aggiornamento – txwikinger

-2

È possibile utilizzare i metodi incorporati attributes forniti da rotaie. Per esempio.

f2 = Foo.new(f1.attributes) 

o

f2 = Foo.new 
f2.attributes = f1.attributes 
+0

Questo non è il modo giusto. La chiave primaria di 'f1' verrà copiata su' f2'. – Zabba

+1

No, non lo farà. La chiave primaria non è inclusa negli attributi assegnati in questo modo in modo simile a tutti gli attributi attr_protected. – Shadwell

+0

Per me in Rails 3.1, sembra che clone copi l'id attraverso. Ma il dup non lo fa. – Kris

Problemi correlati