deep_cloneable 1.2.0 → 1.2.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.
@@ -49,7 +49,8 @@ If this is not an option for you, it is also possible to populate the dictionary
49
49
 
50
50
  dict = { :mateys => {} }
51
51
  pirate.mateys.each{|m| dict[:mateys][m] = m.clone }
52
-
52
+ pirate.clone :include => [:mateys, {:treasures => [:matey, :gold_pieces], :dictionary => dict }]
53
+
53
54
  === Cloning a model without an attribute
54
55
  pirate.clone :except => :name
55
56
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.0
1
+ 1.2.1
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{deep_cloneable}
8
- s.version = "1.2.0"
8
+ s.version = "1.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Reinier de Lange"]
12
- s.date = %q{2010-10-20}
12
+ s.date = %q{2011-02-07}
13
13
  s.description = %q{Extends the functionality of ActiveRecord::Base#clone to perform a deep clone that includes user specified associations. }
14
14
  s.email = %q{r.j.delange@nedforce.nl}
15
15
  s.extra_rdoc_files = [
@@ -74,16 +74,20 @@ class ActiveRecord::Base
74
74
 
75
75
  association_reflection = self.class.reflect_on_association(association)
76
76
  cloned_object = case association_reflection.macro
77
- when :belongs_to, :has_one
78
- self.send(association) && self.send(association).clone(opts)
79
- when :has_many, :has_and_belongs_to_many
80
- fk = association_reflection.options[:foreign_key] || self.class.to_s.underscore
81
- self.send(association).collect do |obj|
82
- tmp = obj.clone(opts)
83
- tmp.send("#{fk}=", kopy)
84
- tmp
85
- end
86
- end
77
+ when :belongs_to, :has_one
78
+ self.send(association) && self.send(association).clone(opts)
79
+ when :has_many, :has_and_belongs_to_many
80
+ if association_reflection.options[:as]
81
+ fk = association_reflection.options[:as].to_s + "_id"
82
+ else
83
+ fk = association_reflection.options[:foreign_key] || self.class.to_s.underscore + "_id"
84
+ end
85
+ self.send(association).collect do |obj|
86
+ tmp = obj.clone(opts)
87
+ tmp.send("#{fk}=", kopy)
88
+ tmp
89
+ end
90
+ end
87
91
  kopy.send("#{association}=", cloned_object)
88
92
  end
89
93
  end
@@ -3,6 +3,7 @@ ActiveRecord::Schema.define(:version => 1) do
3
3
  t.column :name, :string
4
4
  t.column :nick_name, :string, :default => 'no nickname'
5
5
  t.column :age, :string
6
+ t.column :ship_id, :integer
6
7
  end
7
8
 
8
9
  create_table :parrots, :force => true do |t|
@@ -24,4 +25,8 @@ ActiveRecord::Schema.define(:version => 1) do
24
25
  create_table :gold_pieces, :force => true do |t|
25
26
  t.column :treasure_id, :integer
26
27
  end
28
+
29
+ create_table :battle_ships, :force => true do |t|
30
+ t.column :name, :string
31
+ end
27
32
  end
@@ -9,6 +9,7 @@ class TestDeepCloneable < Test::Unit::TestCase
9
9
  @john = Matey.create(:name => 'John', :pirate => @jack)
10
10
  @treasure = Treasure.create(:found_at => 'Isla del Muerte', :pirate => @jack, :matey => @john)
11
11
  @gold_piece = GoldPiece.create(:treasure => @treasure)
12
+ @ship = BattleShip.create(:name => 'Black Pearl', :pirates => [@jack])
12
13
  end
13
14
 
14
15
  def test_single_clone_exception
@@ -33,6 +34,19 @@ class TestDeepCloneable < Test::Unit::TestCase
33
34
  assert_equal 1, clone.mateys.size
34
35
  end
35
36
 
37
+ def test_single_include_belongs_to_polymorphic_association
38
+ clone = @jack.clone(:include => :ship)
39
+ assert clone.save
40
+ assert_not_nil clone.ship
41
+ assert_not_equal @jack.ship, clone.ship
42
+ end
43
+
44
+ def test_single_include_has_many_polymorphic_association
45
+ clone = @ship.clone(:include => :pirates)
46
+ assert clone.save
47
+ assert clone.pirates.any?
48
+ end
49
+
36
50
  def test_multiple_include_association
37
51
  clone = @jack.clone(:include => [:mateys, :treasures])
38
52
  assert clone.save
@@ -10,11 +10,14 @@ require 'active_record'
10
10
  require 'active_record/fixtures'
11
11
  require File.dirname(__FILE__) + '/../init.rb'
12
12
 
13
- class GoldPiece < ActiveRecord::Base; belongs_to :treasure end
14
- class Matey < ActiveRecord::Base; belongs_to :pirate end
15
- class Parrot < ActiveRecord::Base; belongs_to :pirate end
13
+ class GoldPiece < ActiveRecord::Base; belongs_to :treasure end
14
+ class Matey < ActiveRecord::Base; belongs_to :pirate end
15
+ class Parrot < ActiveRecord::Base; belongs_to :pirate end
16
+ class BattleShip < ActiveRecord::Base; has_many :pirates, :as => :ship end
16
17
 
17
18
  class Pirate < ActiveRecord::Base
19
+ belongs_to :ship, :polymorphic => true
20
+
18
21
  has_many :mateys
19
22
  has_many :treasures
20
23
  has_many :gold_pieces, :through => :treasures
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deep_cloneable
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - 0
10
- version: 1.2.0
9
+ - 1
10
+ version: 1.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Reinier de Lange
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-20 00:00:00 +02:00
18
+ date: 2011-02-07 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies: []
21
21