<img src=“https://travis-ci.org/moiristo/deep_cloneable.png?branch=master” alt=“Build Status” />
This gem gives every ActiveRecord::Base object the possibility to do a deep clone. It is a rails3 upgrade of the deep_cloning plugin (github.com/openminds/deep_cloning).
-
Ruby 1.8.7, 1.9.3, 2.0.0
-
Activerecord 3.1, 3.2, 4.0
-
Rails 2.x/3.0 users, please check out the ‘rails2.x-3.0’ branch.
-
In your Gemfile:
gem ‘deep_cloneable’, ‘~> 1.5.4’
pirate.dup :include => :mateys
pirate.dup :include => [:mateys, :treasures]
pirate.dup :include => {:treasures => :gold_pieces}
pirate.dup :include => [:mateys, {:treasures => :gold_pieces}]
A dictionary ensures that models are not cloned multiple times when it is associated to nested models. When using a dictionary, ensure recurring associations are cloned first:
pirate.dup :include => [:mateys, {:treasures => [:matey, :gold_pieces]}], :use_dictionary => true
If this is not an option for you, it is also possible to populate the dictionary manually in advance:
dict = { :mateys => {} } pirate.mateys.each{|m| dict[:mateys][m] = m.dup } pirate.dup :include => [:mateys, {:treasures => [:matey, :gold_pieces]}], :dictionary => dict
When an object isn’t found in the dictionary, it will be populated. By passing in an empty dictionary you can populate it automatically and reuse it in subsequent dups to avoid creating multiples of the same object where you have overlapping associations.
pirate.dup :except => :name
pirate.dup :except => [:name, :nick_name]
pirate.dup :include => :parrot, :except => [:name, { :parrot => [:name] }]
pirate.dup :include => :parrot do |original, kopy| kopy.cloned_from_id = original.id if kopy.respond_to?(:cloned_from_id) end
pirate.dup :include => {:treasures => :gold_pieces}, :validate => false
-
Michael He
-
Indrek Juhkam
-
Mart Karu
-
Rolf Timmermans
-
Ilya Kuzmin
-
zozi
-
fractious
-
Georges Gabereau
-
Christophe Belpaire
-
Kevin Carter
-
fokcep
-
Fork the project.
-
Make your feature addition or bug fix.
-
Add tests for it. This is important so I don’t break it in a future version unintentionally.
-
Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
-
Send me a pull request. Bonus points for topic branches.
Copyright © 2013 Reinier de Lange. See LICENSE for details.