duplicate_it 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/duplicate_it.rb +71 -0
  2. metadata +46 -0
@@ -0,0 +1,71 @@
1
+ module DuplicateIt
2
+ def self.included(base)
3
+ base.extend(ClassMethods)
4
+ end
5
+
6
+ module ClassMethods
7
+ #Test method
8
+ def duplicate_it(*args)
9
+ puts "------- from duplicate_it --------"
10
+ puts args.inspect
11
+ end
12
+ end
13
+
14
+ def duplicate
15
+ create_duplicate_of_self(self)
16
+ end
17
+
18
+ private
19
+
20
+ #Creates a duplicate record from an existing record, ignoring 'ignorable_attributes'
21
+ def create_duplicate_record(record)
22
+ ignorable_attributes = ["id", "type", "created_at", "updated_at"]
23
+ record_attributes = record.attributes
24
+ ignorable_attributes.each { |ignorable_attribute| record_attributes.delete(ignorable_attribute) }
25
+
26
+ duplicate_record = record.class.new(record_attributes)
27
+ if duplicate_record.save
28
+ return duplicate_record
29
+ else
30
+ puts "Error saving #{duplicate_record}"
31
+ puts "Error trace: #{duplicate_record.errros.inspect}"
32
+ end
33
+ return nil
34
+ end
35
+
36
+ #Creates a duplicate of self
37
+ def create_duplicate_of_self(record)
38
+ # Approach-I: Using FILO technique to create object starting form last node children
39
+ # if record.class.reflect_on_all_associations(:has_many).size > 0
40
+ # record.class.reflect_on_all_associations(:has_many).each do |has_many_reflection|
41
+ # children_records = record.send(has_many_reflection.name).collect { |has_many_record| create_duplicate_of_self(has_many_record) }
42
+ # duplicate_record = create_duplicate_record(record)
43
+ # puts "===================== #{duplicate_record.errors.inspect}"
44
+ # duplicate_record.send("#{has_many_reflection.name}=", children_records) unless duplicate_record.nil?
45
+ # return duplicate_record
46
+ # end
47
+ # else
48
+ # return create_duplicate_record(record)
49
+ # end
50
+
51
+
52
+ # Approach-II : Using FIFO technique to create object starting from trunk and then traversing to children node
53
+ duplicate_record = create_duplicate_record(record)
54
+ unless duplicate_record.nil?
55
+ record.class.reflect_on_all_associations(:has_many).each do |has_many_reflection|
56
+ if record.send(has_many_reflection.name).count > 0
57
+ record.send(has_many_reflection.name).each do |has_many_record|
58
+ duplicate_record.send("#{has_many_reflection.name}=", (duplicate_record.send("#{has_many_reflection.name}") + [create_duplicate_of_self(has_many_record)]))
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ return duplicate_record
65
+ end
66
+ end
67
+
68
+ #Adding to ActiveRecord::Base
69
+ class ActiveRecord::Base
70
+ include DuplicateIt
71
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: duplicate_it
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Praveen Kumar Sinha
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-04 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: A simple gem to dulicate a model instance, including its 'has_many' assocaited
15
+ objects
16
+ email: praveen.kumar.sinha@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/duplicate_it.rb
22
+ homepage: http://rubygems.org/gems/duplicate_it
23
+ licenses: []
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 1.8.13
43
+ signing_key:
44
+ specification_version: 3
45
+ summary: DuplicateIt!
46
+ test_files: []