composite_primary_keys 4.0.0.beta2 → 4.0.0.beta3

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.
data/History.txt CHANGED
@@ -1,4 +1,8 @@
1
- == 4.0.0.beta2 Not released
1
+ == 4.0.0.beta3 2011-07-08
2
+ * Fix the ability to update the values of a primary key (Travis Warlick)
3
+ * Support port and host configurations for postgres rake tasks (Travis Warlick)
4
+
5
+ == 4.0.0.beta2 2011-06-21
2
6
  * ActiveRecord 3.1 RC4 compatibility.
3
7
  * Fix instantiation of CPK models with included associations
4
8
 
@@ -6,10 +10,11 @@
6
10
  * ActiveRecord 3.1 RC1 compatibility. This required a significant rewrite due to
7
11
  all the changes in AR 3.1 versus 3.0.
8
12
 
9
- == 3.1.10 Not released
13
+ == 3.1.10 2011-07-08
10
14
  * Bugfix for belongs_to with includes (John Ash)
11
15
  * Improved tests for calling clear on a habtm association, which involved (David Rueck)
12
16
  * Fixed bug that resulted in unrelated records being deleted when calling (David Rueck)
17
+ * Output deprecation warnings about extra columns in join table CPK-aware (David Rueck)
13
18
 
14
19
 
15
20
  == 3.1.9 2011-06-04
@@ -46,6 +46,8 @@ require 'active_record/associations/preloader/association'
46
46
  require 'active_record/associations/preloader/belongs_to'
47
47
  require 'active_record/associations/preloader/has_and_belongs_to_many'
48
48
 
49
+ require 'active_model/dirty'
50
+
49
51
  require 'active_record/attribute_methods/dirty'
50
52
  require 'active_record/attribute_methods/read'
51
53
  require 'active_record/attribute_methods/write'
@@ -80,6 +82,8 @@ require 'composite_primary_keys/associations/preloader/association'
80
82
  require 'composite_primary_keys/associations/preloader/belongs_to'
81
83
  require 'composite_primary_keys/associations/preloader/has_and_belongs_to_many'
82
84
 
85
+ require 'composite_primary_keys/dirty'
86
+
83
87
  require 'composite_primary_keys/attribute_methods/dirty'
84
88
  require 'composite_primary_keys/attribute_methods/read'
85
89
  require 'composite_primary_keys/attribute_methods/write'
@@ -120,6 +120,10 @@ module ActiveRecord
120
120
  populate_with_current_scope_attributes
121
121
  clear_timestamp_attributes
122
122
  end
123
+
124
+ def can_change_primary_key_values?
125
+ false
126
+ end
123
127
  end
124
128
  end
125
129
  end
@@ -0,0 +1,19 @@
1
+ module ActiveModel
2
+ module Dirty
3
+ def can_change_primary_key?
4
+ true
5
+ end
6
+
7
+ def primary_key_changed?
8
+ !!changed.detect { |key| ids_hash.keys.include?(key.to_sym) }
9
+ end
10
+
11
+ def primary_key_was
12
+ ids_hash.keys.inject(Hash.new) do |result, attribute_name|
13
+ result[attribute_name.to_sym] = attribute_was(attribute_name.to_s)
14
+ result
15
+ end
16
+ end
17
+ alias_method :ids_hash_was, :primary_key_was
18
+ end
19
+ end
@@ -32,15 +32,22 @@ module ActiveRecord
32
32
  end
33
33
 
34
34
  def update(attribute_names = @attributes.keys)
35
- attributes_with_values = arel_attributes_values(false, false, attribute_names)
36
- return 0 if attributes_with_values.empty?
37
35
  klass = self.class
38
- # CPK
39
36
  if !self.composite?
37
+ attributes_with_values = arel_attributes_values(false, false, attribute_names)
38
+ return 0 if attributes_with_values.empty?
40
39
  stmt = klass.unscoped.where(klass.arel_table[klass.primary_key].eq(id)).arel.compile_update(attributes_with_values)
41
40
  else
42
- # CPK
43
- stmt = klass.unscoped.where(ids_hash).arel.compile_update(attributes_with_values)
41
+ attributes_with_values = arel_attributes_values(can_change_primary_key?, false, attribute_names)
42
+ return 0 if attributes_with_values.empty?
43
+
44
+ if !can_change_primary_key? and primary_key_changed?
45
+ raise ActiveRecord::CompositeKeyError, "Cannot update primary key values without ActiveModel::Dirty"
46
+ elsif primary_key_changed?
47
+ stmt = klass.unscoped.where(primary_key_was).arel.compile_update(attributes_with_values)
48
+ else
49
+ stmt = klass.unscoped.where(ids_hash).arel.compile_update(attributes_with_values)
50
+ end
44
51
  end
45
52
  klass.connection.update stmt.to_sql
46
53
  end
@@ -3,6 +3,6 @@ module CompositePrimaryKeys
3
3
  MAJOR = 4
4
4
  MINOR = 0
5
5
  TINY = 0
6
- STRING = [MAJOR, MINOR, TINY, 'beta2'].join('.')
6
+ STRING = [MAJOR, MINOR, TINY, 'beta3'].join('.')
7
7
  end
8
8
  end
@@ -7,6 +7,8 @@ require File.join(PROJECT_ROOT, 'lib', 'composite_primary_keys', 'connection_ada
7
7
  def connection_string
8
8
  options = Hash.new
9
9
  options['U'] = SPEC['username'] if SPEC['username']
10
+ options['h'] = SPEC['host'] if SPEC['host']
11
+ options['p'] = SPEC['port'] if SPEC['port']
10
12
  options.map { |key, value| "-#{key} #{value}" }.join(" ")
11
13
  end
12
14
 
@@ -1,7 +1,6 @@
1
1
  first_product:
2
2
  id: 1
3
3
  name: Product One
4
-
5
4
  second_product:
6
5
  id: 2
7
6
  name: Product Two
@@ -6,4 +6,7 @@ second:
6
6
  city_id: 2
7
7
  suburb_id: 1
8
8
  name: Second Suburb
9
-
9
+ no_mcdonalds:
10
+ city_id: 1
11
+ suburb_id: 2
12
+ name: Third Suburb
data/test/test_habtm.rb CHANGED
@@ -13,6 +13,48 @@ class TestHabtm < ActiveSupport::TestCase
13
13
  assert_equal 2, @restaurant.suburbs.size
14
14
  end
15
15
 
16
+ def test_include_cpk_both_sides
17
+ # assuming the association was set up in the fixtures
18
+ # file restaurants_suburbs.yml
19
+ mcdonalds = restaurants(:mcdonalds)
20
+ # check positive
21
+ suburb = mcdonalds.suburbs[0]
22
+ assert mcdonalds.suburbs.include?(suburb)
23
+ # check negative
24
+ suburb_with_no_mcdonalds = suburbs(:no_mcdonalds)
25
+ assert !mcdonalds.suburbs.include?(suburb_with_no_mcdonalds)
26
+ end
27
+
28
+ def test_include_cpk_owner_side_only
29
+ subway = restaurants(:subway_one)
30
+ product = products(:first_product)
31
+ subway.products << product
32
+
33
+ # reload
34
+ # test positive
35
+ subway = restaurants(:subway_one)
36
+ assert subway.products.include?(product)
37
+
38
+ # test negative
39
+ product_two = products(:second_product)
40
+ assert !subway.products.include?(product_two)
41
+ end
42
+
43
+ def test_include_cpk_association_side_only
44
+ product = products(:first_product)
45
+ subway = restaurants(:subway_one)
46
+ product.restaurants << subway
47
+
48
+ # reload
49
+ # test positive
50
+ product = products(:first_product)
51
+ assert product.restaurants.include?(subway)
52
+
53
+ # test negative
54
+ mcdonalds = restaurants(:mcdonalds)
55
+ assert !product.restaurants.include?(mcdonalds)
56
+ end
57
+
16
58
  def test_habtm_clear_cpk_both_sides
17
59
  @restaurant = restaurants(:mcdonalds)
18
60
  assert_equal 2, @restaurant.suburbs.size
data/test/test_update.rb CHANGED
@@ -35,4 +35,19 @@ class TestUpdate < ActiveSupport::TestCase
35
35
  end
36
36
  end
37
37
  end
38
+
39
+ def test_update_primary_key
40
+ obj = ReferenceCode.find([1,1])
41
+ obj.reference_type_id = 2
42
+ obj.reference_code = 3
43
+ assert(obj.primary_key_changed?)
44
+ assert_equal({:reference_type_id => 1, :reference_code => 1}, obj.primary_key_was)
45
+ assert_equal({:reference_type_id => 2, :reference_code => 3}, obj.ids_hash)
46
+ assert(obj.save)
47
+ assert(obj.reload)
48
+ assert_equal(2, obj.reference_type_id)
49
+ assert_equal(3, obj.reference_code)
50
+ assert_equal({:reference_type_id => 2, :reference_code => 3}, obj.ids_hash)
51
+ assert_equal([2, 3], obj.id)
52
+ end
38
53
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: composite_primary_keys
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196263
4
+ hash: 62196261
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 4
8
8
  - 0
9
9
  - 0
10
10
  - beta
11
- - 2
12
- version: 4.0.0.beta2
11
+ - 3
12
+ version: 4.0.0.beta3
13
13
  platform: ruby
14
14
  authors:
15
15
  - Dr Nic Williams
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2011-06-21 00:00:00 Z
21
+ date: 2011-07-08 00:00:00 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: activerecord
@@ -73,6 +73,7 @@ files:
73
73
  - lib/composite_primary_keys/composite_predicates.rb
74
74
  - lib/composite_primary_keys/connection_adapters/abstract_adapter.rb
75
75
  - lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb
76
+ - lib/composite_primary_keys/dirty.rb
76
77
  - lib/composite_primary_keys/fixtures.rb
77
78
  - lib/composite_primary_keys/persistence.rb
78
79
  - lib/composite_primary_keys/relation/calculations.rb