2009-08-11 7 views
36

J'ai un modèle Foo avec les attributs id, name, location. J'ai une instance de Foo:Copier des instances de modèle dans Rails

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

Je voudrais copier f1 et de cette copie, créer une autre instance du modèle Foo, mais je ne veux pas f1.id de reporter à f2.id (Je ne Je ne veux pas l'assigner explicitement, je veux que le db le gère, comme il se doit.

Existe-t-il un moyen simple de le faire, autre que de copier manuellement chaque attribut? N'y a-t-il pas de fonctions intégrées ou est-ce que l'écriture serait la meilleure?

Merci

+0

Jusqu'ici j'ai créé une .copy méthode pour le modèle spécifique, à savoir: f2 = f1.copy f2.name = « Baz » f2.save toujours essayer différentes solutions – user94154

Répondre

58

C'est ce que la méthode ActiveRecord::Base#clone est pour:

@bar = @foo.clone 

@bar.save 
+75

Utilisez maintenant @ foo.dup pour les rails 3.1 et suivants. Cloner copie l'identifiant. – Ultimation

2

une mauvaise façon de le faire serait:

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

ou dans une ligne, mais encore mal:

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

voir les commentaires détails

+0

vous gagnez pour être le premier. BEAUCOUP merci pour l'aide à vous deux !!! Génie! – user94154

+7

CECI NE FONCTIONNERA PAS! tous les attributs qui ne sont pas dans attr_accessible ou qui sont dans attr_protected seront perdus! ou si vous utilisez l'un des plugins de protection d'attribut, une exception sera levée! –

+3

Non seulement cela, tous les identifiants sont toujours les mêmes, donc enregistrer fera juste une mise à jour – txwikinger

-2

Vous pouvez utiliser les méthodes intégrées attributes fournies par les rails. Par exemple.

f2 = Foo.new(f1.attributes) 

ou

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

Ce n'est pas la bonne façon. La clé primaire de 'f1' sera copiée sur' f2'. – Zabba

+1

Non, ce ne sera pas le cas. La clé primaire n'est pas incluse dans les attributs affectés de cette manière de la même manière que les attributs attr_protected. – Shadwell

+0

Pour moi dans Rails 3.1, il semble que clone copie l'ID à travers. Mais dup ne le fait pas. – Kris

Questions connexes