2009-03-27 4 views
17

est-il un moyen de copier les associations d'un modèle à l'autre ...ActiveRecord: Puis-je copier des associations?

template_model = MyModel.find(id) 
new_model = template_model.clone 
new_model.children << template_model.children # I want to *copy* children 

... telle que je copie les enfants du modèle au nouveau modèle? (En fait, ce code déplace les enfants du modèle au nouveau modèle).

Je sais que je peux le faire manuellement en boucle, mais y a-t-il des moyens plus succincts?

Merci

Répondre

25

Le problème est que vous cloner le modèle, mais pas cloner des enfants. Essayez quelque chose comme:

template_model = MyModel.find(id) 
new_model = template_model.clone 
new_model.children << template_model.children.collect { |child| child.clone } 
+1

Parfait! C'est tout - gentil et succinct. Merci beaucoup. – Paul

0

Eh bien, ce n'est pas vraiment une copie.

Mais vous pourriez faire Ajouter ce une

new_model.child_ids = template_model.child_ids 
3

où est sous/lib. Par exemple clone_deep.rb. Créer un nouvel initialiseur sous le répertoire config/initializers /. A l'intérieur de ce fichier, coller

ActiveRecord::Base.send(:include, CloneDeep) 

Maintenant, vous pouvez cloner le modèle avec toutes ses associations has_one et hos_many.

cloned_person = person.clone_deep 
cloned_person.save 
+0

Seule cette solution simple a fonctionné pour moi .. à la fois amibe et gemmes deep_cloneable étaient par défaut en appelant dup et ne copiant pas les associations .. gem deep_cloneable échoué sur a beaucoup de travers..rails 4.1 Merci – Abs

1

#dup doit être utilisé au lieu de #clone, étant donné que les attributs ne sont pas copiés dans le cas de ce dernier.

module Promotion 
    class Banner 
    has_many :localizations 
    has_many :images 

    def deep_dup! 
     duplicate = dup 
     duplicate.save 

     duplicate.localizations = localizations.collect { |localization| localization.dup } 
     duplicate.images = images.collect { |image| image.dup } 

     duplicate 
    end 
    end 
end 

http://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-dup

Questions connexes