2009-08-11 14 views
36

Ich habe ein Modell Foo mit Attributen id, name, location. Ich habe eine Instanz von Foo:Kopieren von Modellinstanzen in Rails

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

Ich möchte f1 kopieren und von dieser Kopie, eine weitere Instanz des Foo Modell erstellen, aber ich will nicht f1.id zu f2.id übertragen (I don‘ Ich möchte das explizit zuweisen, ich möchte, dass die db sie so behandelt, wie sie sollte.

Gibt es eine einfache Möglichkeit, dies zu tun, außer jedes Attribut manuell zu kopieren? Irgendwelche eingebauten Funktionen oder würde das Schreiben die beste Route sein?

Dank

+0

Bisher habe ich eine Methode .copy für das jeweilige Modell erstellt, das heißt: f2 = f1.copy f2.name = „Baz“ f2.save noch versuchen verschiedene Lösungen – user94154

Antwort

58

Dies ist, was ActiveRecord::Base#clone Methode ist für:

@bar = @foo.clone 

@bar.save 
+75

Verwenden Sie @ foo.dup jetzt für Schienen 3.1 und höher. Clone kopiert die ID. – Ultimation

2

ein falsch Weg, dies zu tun wäre:

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

oder in einer Linie, aber immer noch falsch:

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

siehe Kommentare für Details

+0

Dank für Ihre erste gewinnen. Vielen Dank für die Hilfe an euch beide !!! Genius! – user94154

+7

Das wird nicht funktionieren! Alle Attribute, die sich nicht in attr_accessible befinden oder in attr_protected sind, gehen verloren! oder wenn Sie eines der Attributschutz-Plugins verwenden, wird eine Ausnahme ausgelöst! –

+3

Nicht nur das, alle IDs sind immer noch die gleichen, so speichern wird nur ein Update – txwikinger

-2

Sie können die integrierten Methoden attributes verwenden, die Schienen zur Verfügung stellt. Z.B.

f2 = Foo.new(f1.attributes) 

oder

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

Dies ist nicht der richtige Weg. Der Primärschlüssel von 'f1' wird zu' f2' kopiert. – Zabba

+1

Nein, wird es nicht. Der Primärschlüssel ist in Attributen, die auf diese Weise zugewiesen sind, nicht in ähnlicher Weise wie attr_protected-Attribute enthalten. – Shadwell

+0

Für mich in Rails 3.1, scheint es Klone kopiert die ID über. Aber dup nicht. – Kris

Verwandte Themen