composite_primary_keys 9.0.10 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/History.rdoc +4 -9
- data/README.rdoc +10 -9
- data/lib/composite_primary_keys.rb +6 -5
- data/lib/composite_primary_keys/arel/sqlserver.rb +2 -1
- data/lib/composite_primary_keys/associations/association_scope.rb +4 -4
- data/lib/composite_primary_keys/associations/collection_association.rb +1 -1
- data/lib/composite_primary_keys/associations/preloader/association.rb +2 -2
- data/lib/composite_primary_keys/associations/preloader/belongs_to.rb +2 -2
- data/lib/composite_primary_keys/attribute_methods/primary_key.rb +14 -1
- data/lib/composite_primary_keys/attribute_methods/write.rb +14 -0
- data/lib/composite_primary_keys/attribute_set/builder.rb +22 -0
- data/lib/composite_primary_keys/base.rb +6 -5
- data/lib/composite_primary_keys/composite_predicates.rb +4 -0
- data/lib/composite_primary_keys/connection_adapters/abstract_adapter.rb +10 -10
- data/lib/composite_primary_keys/connection_adapters/postgresql/database_statements.rb +26 -0
- data/lib/composite_primary_keys/core.rb +9 -12
- data/lib/composite_primary_keys/locking/optimistic.rb +7 -7
- data/lib/composite_primary_keys/nested_attributes.rb +1 -1
- data/lib/composite_primary_keys/relation.rb +1 -6
- data/lib/composite_primary_keys/relation/predicate_builder/association_query_handler.rb +33 -0
- data/lib/composite_primary_keys/version.rb +2 -2
- data/scripts/console.rb +48 -48
- data/scripts/txt2html +76 -76
- data/scripts/txt2js +65 -65
- data/tasks/website.rake +18 -18
- data/test/README_tests.rdoc +56 -56
- data/test/connections/databases.yml +30 -40
- data/test/db_test.rb +52 -52
- data/test/fixtures/articles.yml +6 -6
- data/test/fixtures/capitol.rb +3 -3
- data/test/fixtures/capitols.yml +16 -16
- data/test/fixtures/comments.yml +15 -15
- data/test/fixtures/department.rb +5 -5
- data/test/fixtures/departments.yml +15 -15
- data/test/fixtures/dorms.yml +4 -4
- data/test/fixtures/group.rb +2 -2
- data/test/fixtures/groups.yml +6 -6
- data/test/fixtures/hack.rb +4 -4
- data/test/fixtures/hacks.yml +2 -2
- data/test/fixtures/membership_status.rb +2 -2
- data/test/fixtures/product.rb +9 -9
- data/test/fixtures/product_tariff.rb +5 -5
- data/test/fixtures/products.yml +11 -11
- data/test/fixtures/reading.rb +4 -4
- data/test/fixtures/readings.yml +10 -10
- data/test/fixtures/reference_code_using_composite_key_alias.rb +8 -8
- data/test/fixtures/reference_code_using_simple_key_alias.rb +8 -8
- data/test/fixtures/reference_codes.yml +28 -28
- data/test/fixtures/reference_types.yml +9 -9
- data/test/fixtures/restaurant.rb +9 -9
- data/test/fixtures/restaurants.yml +14 -14
- data/test/fixtures/restaurants_suburbs.yml +10 -10
- data/test/fixtures/room.rb +11 -11
- data/test/fixtures/room_assignment.rb +13 -13
- data/test/fixtures/room_assignments.yml +24 -24
- data/test/fixtures/room_attribute.rb +2 -2
- data/test/fixtures/room_attribute_assignment.rb +4 -4
- data/test/fixtures/room_attribute_assignments.yml +4 -4
- data/test/fixtures/room_attributes.yml +2 -2
- data/test/fixtures/rooms.yml +12 -12
- data/test/fixtures/seat.rb +5 -5
- data/test/fixtures/seats.yml +8 -8
- data/test/fixtures/street.rb +2 -2
- data/test/fixtures/streets.yml +16 -16
- data/test/fixtures/student.rb +3 -3
- data/test/fixtures/students.yml +15 -15
- data/test/fixtures/suburbs.yml +14 -14
- data/test/fixtures/tariffs.yml +14 -14
- data/test/plugins/pagination.rb +405 -405
- data/test/plugins/pagination_helper.rb +135 -135
- data/test/setup.rb +50 -50
- data/test/test_aliases.rb +18 -18
- data/test/test_associations.rb +0 -10
- data/test/test_composite_arrays.rb +24 -24
- data/test/test_counter_cache.rb +30 -30
- data/test/test_dup.rb +37 -37
- data/test/test_exists.rb +39 -39
- data/test/test_find.rb +9 -3
- data/test/test_miscellaneous.rb +32 -32
- data/test/test_pagination.rb +35 -35
- data/test/test_validations.rb +13 -13
- metadata +8 -13
- data/lib/composite_primary_keys/autosave_association.rb +0 -32
- data/lib/composite_primary_keys/relation/predicate_builder.rb +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d393427145f3047288fffba8fc3434fa41518f4e
|
4
|
+
data.tar.gz: f828598d6e09660c798a7735510c5130084b85b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb6c3cfc3c74ddd3eca736945a5e70cebc2a093e704d0407cbe2983670be5282958cffa24507069e623b1099984fceeb02864b55a76d29c3712bcfac91686a58
|
7
|
+
data.tar.gz: eeef7b365078357a92b2167f200458bde725b3b3e2032bb17d0799bd19a02e93314e758f89dcf97144d3d39a315cb22fa2120f9848d3496f9f2355190c447dd2
|
data/History.rdoc
CHANGED
@@ -1,14 +1,9 @@
|
|
1
|
-
==
|
2
|
-
|
3
|
-
* Fix AR 5.0.7 (Jordan Owens)
|
4
|
-
|
5
|
-
== 9.0.9 (2018-03-06)
|
6
|
-
|
7
|
-
* Fix update statements that incorrectly pass NULL values for the primary key components (Sean Linsley)
|
8
|
-
|
9
|
-
== 9.0.8 (2017-10-11)
|
1
|
+
== 10.0.0 (2017-10-08)
|
10
2
|
|
3
|
+
* Support ActiveRecord 5.1.x (Pinak Thakkar, Jordan Owens)
|
11
4
|
* Fix Paper Trail compatibility (Sean Linsley)
|
5
|
+
* Fix typo in Readme (Mike Gunderloy)
|
6
|
+
* Improved sql server support (Artyom Nikolaev)
|
12
7
|
|
13
8
|
== 9.0.7 (2017-05-22)
|
14
9
|
|
data/README.rdoc
CHANGED
@@ -12,7 +12,7 @@ to support composite keys.
|
|
12
12
|
|
13
13
|
If you are using Rails add the following to your Gemfile:
|
14
14
|
|
15
|
-
gem 'composite_primary_keys', '=x.x.x' (see next section about what
|
15
|
+
gem 'composite_primary_keys', '=x.x.x' (see next section about what version to use)
|
16
16
|
|
17
17
|
== Versions
|
18
18
|
|
@@ -20,12 +20,13 @@ Every major version of ActiveRecord has included numerous internal changes. As
|
|
20
20
|
CPK has to be rewritten for each version of ActiveRecord. To help keep
|
21
21
|
things straight, here is the mapping:
|
22
22
|
|
23
|
-
Version
|
24
|
-
Version
|
25
|
-
Version
|
26
|
-
Version
|
27
|
-
Version
|
28
|
-
Version
|
23
|
+
Version 10.x is designed to work with ActiveRecord 5.1.x (note this is in progress)
|
24
|
+
Version 9.x is designed to work with ActiveRecord 5.0.x
|
25
|
+
Version 8.x is designed to work with ActiveRecord 4.2.x
|
26
|
+
Version 7.x is designed to work with ActiveRecord 4.1.x
|
27
|
+
Version 6.x is designed to work with ActiveRecord 4.0.x
|
28
|
+
Version 5.x is designed to work with ActiveRecord 3.2.x
|
29
|
+
Version 4.x is designed to work with ActiveRecord 3.1.x
|
29
30
|
|
30
31
|
Run the following command to list available versions:
|
31
32
|
|
@@ -155,8 +156,8 @@ built-in rake task before running tests:
|
|
155
156
|
|
156
157
|
rake sqlite:build_database
|
157
158
|
|
158
|
-
|
159
|
-
|
159
|
+
For sqlite3 to work correctly, you must manually require 'composite_primary_keys/connection_adapters/sqlite3_adapter' after
|
160
|
+
loading the CPK gem.
|
160
161
|
|
161
162
|
=== SqlServer
|
162
163
|
|
@@ -26,7 +26,7 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
26
26
|
|
27
27
|
unless defined?(ActiveRecord)
|
28
28
|
require 'rubygems'
|
29
|
-
gem 'activerecord', '~>5.
|
29
|
+
gem 'activerecord', '~>5.1.0'
|
30
30
|
require 'active_record'
|
31
31
|
end
|
32
32
|
|
@@ -38,7 +38,6 @@ require 'active_record/persistence'
|
|
38
38
|
require 'active_record/relation'
|
39
39
|
require 'active_record/sanitization'
|
40
40
|
require 'active_record/attribute_methods'
|
41
|
-
require 'active_record/autosave_association'
|
42
41
|
|
43
42
|
require 'active_record/associations/association'
|
44
43
|
require 'active_record/associations/association_scope'
|
@@ -51,6 +50,7 @@ require 'active_record/associations/preloader/belongs_to'
|
|
51
50
|
require 'active_record/associations/singular_association'
|
52
51
|
require 'active_record/associations/collection_association'
|
53
52
|
|
53
|
+
require 'active_record/attribute_set/builder'
|
54
54
|
require 'active_record/attribute_methods/primary_key'
|
55
55
|
require 'active_record/attribute_methods/read'
|
56
56
|
require 'active_record/attribute_methods/write'
|
@@ -59,12 +59,12 @@ require 'active_record/nested_attributes'
|
|
59
59
|
|
60
60
|
require 'active_record/connection_adapters/abstract_adapter'
|
61
61
|
require 'active_record/connection_adapters/abstract_mysql_adapter'
|
62
|
+
require 'active_record/connection_adapters/postgresql/database_statements'
|
62
63
|
|
63
64
|
require 'active_record/relation/batches'
|
64
65
|
require 'active_record/relation/where_clause'
|
65
66
|
require 'active_record/relation/calculations'
|
66
67
|
require 'active_record/relation/finder_methods'
|
67
|
-
require 'active_record/relation/predicate_builder'
|
68
68
|
require 'active_record/relation/query_methods'
|
69
69
|
|
70
70
|
# CPK files
|
@@ -76,8 +76,8 @@ require 'composite_primary_keys/composite_predicates'
|
|
76
76
|
require 'composite_primary_keys/fixtures'
|
77
77
|
require 'composite_primary_keys/relation'
|
78
78
|
require 'composite_primary_keys/sanitization'
|
79
|
+
require 'composite_primary_keys/attribute_set/builder'
|
79
80
|
require 'composite_primary_keys/attribute_methods'
|
80
|
-
require 'composite_primary_keys/autosave_association'
|
81
81
|
require 'composite_primary_keys/version'
|
82
82
|
|
83
83
|
require 'composite_primary_keys/associations/association'
|
@@ -98,12 +98,13 @@ require 'composite_primary_keys/nested_attributes'
|
|
98
98
|
|
99
99
|
require 'composite_primary_keys/connection_adapters/abstract_adapter'
|
100
100
|
require 'composite_primary_keys/connection_adapters/abstract_mysql_adapter'
|
101
|
+
require 'composite_primary_keys/connection_adapters/postgresql/database_statements'
|
101
102
|
|
102
103
|
require 'composite_primary_keys/relation/batches'
|
103
104
|
require 'composite_primary_keys/relation/where_clause'
|
104
105
|
require 'composite_primary_keys/relation/calculations'
|
105
106
|
require 'composite_primary_keys/relation/finder_methods'
|
106
|
-
require 'composite_primary_keys/relation/predicate_builder'
|
107
|
+
require 'composite_primary_keys/relation/predicate_builder/association_query_handler'
|
107
108
|
require 'composite_primary_keys/relation/query_methods'
|
108
109
|
|
109
110
|
require 'composite_primary_keys/composite_relation'
|
@@ -16,7 +16,8 @@ module Arel
|
|
16
16
|
|
17
17
|
def primary_Key_From_Table t
|
18
18
|
return unless t
|
19
|
-
column_name = schema_cache.primary_keys(t.name) ||
|
19
|
+
column_name = @connection.schema_cache.primary_keys(t.name) ||
|
20
|
+
@connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
|
20
21
|
|
21
22
|
# CPK
|
22
23
|
# column_name ? t[column_name] : nil
|
@@ -23,8 +23,8 @@ module ActiveRecord
|
|
23
23
|
binds
|
24
24
|
end
|
25
25
|
|
26
|
-
def last_chain_scope(scope, table, reflection, owner
|
27
|
-
join_keys = reflection.join_keys
|
26
|
+
def last_chain_scope(scope, table, reflection, owner)
|
27
|
+
join_keys = reflection.join_keys
|
28
28
|
key = join_keys.key
|
29
29
|
foreign_key = join_keys.foreign_key
|
30
30
|
|
@@ -46,8 +46,8 @@ module ActiveRecord
|
|
46
46
|
scope
|
47
47
|
end
|
48
48
|
|
49
|
-
def next_chain_scope(scope, table, reflection,
|
50
|
-
join_keys = reflection.join_keys
|
49
|
+
def next_chain_scope(scope, table, reflection, foreign_table, next_reflection)
|
50
|
+
join_keys = reflection.join_keys
|
51
51
|
key = join_keys.key
|
52
52
|
foreign_key = join_keys.foreign_key
|
53
53
|
|
@@ -29,7 +29,7 @@ module CompositePrimaryKeys
|
|
29
29
|
ids.map! { |i| pk_type.cast(i) }
|
30
30
|
# CPK
|
31
31
|
if reflection.association_primary_key.is_a?(Array)
|
32
|
-
predicate =
|
32
|
+
predicate = CompositePrimaryKeys::Predicates.cpk_in_predicate(klass.arel_table, reflection.association_primary_key, ids)
|
33
33
|
records = klass.where(predicate).index_by do |r|
|
34
34
|
reflection.association_primary_key.map{ |k| r.send(k) }
|
35
35
|
end.values_at(*ids)
|
@@ -3,9 +3,9 @@ module ActiveRecord
|
|
3
3
|
class Preloader
|
4
4
|
class Association
|
5
5
|
silence_warnings do
|
6
|
-
def
|
6
|
+
def records_for(ids)
|
7
7
|
# CPK
|
8
|
-
# scope.where(
|
8
|
+
# scope.where(association_key_name => ids)
|
9
9
|
|
10
10
|
if reflection.foreign_key.is_a?(Array)
|
11
11
|
predicate = cpk_in_predicate(table, reflection.foreign_key, ids)
|
@@ -2,7 +2,7 @@ module ActiveRecord
|
|
2
2
|
module Associations
|
3
3
|
class Preloader
|
4
4
|
class BelongsTo
|
5
|
-
def
|
5
|
+
def records_for(ids)
|
6
6
|
# CPK
|
7
7
|
# scope.where(association_key.in(ids))
|
8
8
|
|
@@ -10,7 +10,7 @@ module ActiveRecord
|
|
10
10
|
predicate = cpk_in_predicate(table, association_key_name, ids)
|
11
11
|
scope.where(predicate)
|
12
12
|
else
|
13
|
-
scope.where(
|
13
|
+
scope.where(association_key_name => ids)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -9,13 +9,26 @@ module ActiveRecord
|
|
9
9
|
# attribute_was(self.class.primary_key)
|
10
10
|
if self.composite?
|
11
11
|
self.class.primary_keys.map do |key_attr|
|
12
|
-
|
12
|
+
attribute_changed?(key_attr) ? changed_attributes[key_attr] : self.ids_hash[key_attr]
|
13
13
|
end
|
14
14
|
else
|
15
15
|
attribute_was(self.class.primary_key)
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
19
|
+
|
20
|
+
def id_in_database
|
21
|
+
sync_with_transaction_state
|
22
|
+
# CPK
|
23
|
+
# attribute_in_database(self.class.primary_key)
|
24
|
+
if self.composite?
|
25
|
+
self.class.primary_keys.map do |key_attr|
|
26
|
+
attribute_in_database(key_attr)
|
27
|
+
end
|
28
|
+
else
|
29
|
+
attribute_in_database(self.class.primary_key)
|
30
|
+
end
|
31
|
+
end
|
19
32
|
end
|
20
33
|
end
|
21
34
|
end
|
@@ -2,6 +2,20 @@ module ActiveRecord
|
|
2
2
|
module AttributeMethods
|
3
3
|
module Write
|
4
4
|
silence_warnings do
|
5
|
+
def write_attribute(attr_name, value)
|
6
|
+
name = if self.class.attribute_alias?(attr_name)
|
7
|
+
# CPK
|
8
|
+
# self.class.attribute_alias(attr_name).to_s
|
9
|
+
self.class.attribute_alias(attr_name)
|
10
|
+
else
|
11
|
+
# CPK
|
12
|
+
# attr_name.to_s
|
13
|
+
attr_name
|
14
|
+
end
|
15
|
+
|
16
|
+
write_attribute_with_type_cast(name, value, true)
|
17
|
+
end
|
18
|
+
|
5
19
|
def write_attribute_with_type_cast(attr_name, value, should_type_cast)
|
6
20
|
# CPK
|
7
21
|
if attr_name.kind_of?(Array)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
class AttributeSet # :nodoc:
|
3
|
+
class Builder # :nodoc:
|
4
|
+
silence_warnings do
|
5
|
+
def build_from_database(values = {}, additional_types = {})
|
6
|
+
# CPK
|
7
|
+
# if always_initialized && !values.key?(always_initialized)
|
8
|
+
# values[always_initialized] = nil
|
9
|
+
# end
|
10
|
+
Array(always_initialized).each do |always_initialized_attribute|
|
11
|
+
if always_initialized_attribute && !values.key?(always_initialized_attribute)
|
12
|
+
values[always_initialized_attribute] = nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attributes = LazyAttributeHash.new(types, values, additional_types)
|
17
|
+
AttributeSet.new(attributes)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -47,15 +47,16 @@ module ActiveRecord
|
|
47
47
|
|
48
48
|
module CompositeClassMethods
|
49
49
|
def primary_keys
|
50
|
-
unless defined?
|
51
|
-
reset_primary_keys
|
52
|
-
end
|
50
|
+
@primary_keys = reset_primary_keys unless defined? @primary_keys
|
53
51
|
@primary_keys
|
54
52
|
end
|
55
53
|
|
56
54
|
# Don't like this method name, but its modeled after how AR does it
|
57
|
-
|
58
|
-
if self
|
55
|
+
def reset_primary_keys #:nodoc:
|
56
|
+
if self == base_class
|
57
|
+
# CPK
|
58
|
+
self.primary_keys = get_primary_key(base_class.name)
|
59
|
+
else
|
59
60
|
self.primary_keys = base_class.primary_keys
|
60
61
|
end
|
61
62
|
end
|
@@ -1,5 +1,9 @@
|
|
1
1
|
module CompositePrimaryKeys
|
2
2
|
module Predicates
|
3
|
+
# Similar to module_function, but does not make instance methods private.
|
4
|
+
# https://idiosyncratic-ruby.com/8-self-improvement.html
|
5
|
+
extend self
|
6
|
+
|
3
7
|
def cpk_and_predicate(predicates)
|
4
8
|
if predicates.length == 1
|
5
9
|
predicates.first
|
@@ -1,11 +1,11 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ConnectionAdapters
|
3
|
-
class AbstractAdapter
|
4
|
-
def quote_column_names(name)
|
5
|
-
Array(name).map do |col|
|
6
|
-
quote_column_name(col.to_s)
|
7
|
-
end.join(CompositePrimaryKeys::ID_SEP)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
class AbstractAdapter
|
4
|
+
def quote_column_names(name)
|
5
|
+
Array(name).map do |col|
|
6
|
+
quote_column_name(col.to_s)
|
7
|
+
end.join(CompositePrimaryKeys::ID_SEP)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
11
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module PostgreSQL
|
4
|
+
module DatabaseStatements
|
5
|
+
def sql_for_insert(sql, pk, id_value, sequence_name, binds) # :nodoc:
|
6
|
+
if pk.nil?
|
7
|
+
# Extract the table from the insert sql. Yuck.
|
8
|
+
table_ref = extract_table_ref_from_insert_sql(sql)
|
9
|
+
pk = primary_key(table_ref) if table_ref
|
10
|
+
end
|
11
|
+
|
12
|
+
# CPK
|
13
|
+
# if pk = suppress_composite_primary_key(pk)
|
14
|
+
# sql = "#{sql} RETURNING #{quote_column_name(pk)}"
|
15
|
+
#end
|
16
|
+
# NOTE pk can be false.
|
17
|
+
if pk
|
18
|
+
sql = "#{sql} RETURNING #{quote_column_names(pk)}"
|
19
|
+
end
|
20
|
+
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -27,36 +27,33 @@ module ActiveRecord
|
|
27
27
|
return super if block_given? ||
|
28
28
|
primary_key.nil? ||
|
29
29
|
scope_attributes? ||
|
30
|
-
columns_hash.include?(inheritance_column)
|
31
|
-
|
30
|
+
columns_hash.include?(inheritance_column)
|
31
|
+
|
32
32
|
# CPK
|
33
33
|
return super if self.composite?
|
34
34
|
|
35
|
-
id
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
You are passing an instance of ActiveRecord::Base to `find`.
|
40
|
-
Please pass the id of the object by calling `.id`
|
41
|
-
MSG
|
42
|
-
end
|
35
|
+
id = ids.first
|
36
|
+
|
37
|
+
return super if id.kind_of?(Array) ||
|
38
|
+
id.is_a?(ActiveRecord::Base)
|
43
39
|
|
44
40
|
key = primary_key
|
45
41
|
|
46
42
|
statement = cached_find_by_statement(key) { |params|
|
47
43
|
where(key => params.bind).limit(1)
|
48
44
|
}
|
45
|
+
|
49
46
|
record = statement.execute([id], self, connection).first
|
50
47
|
unless record
|
51
48
|
raise RecordNotFound.new("Couldn't find #{name} with '#{primary_key}'=#{id}",
|
52
49
|
name, primary_key, id)
|
53
50
|
end
|
54
51
|
record
|
55
|
-
rescue RangeError
|
52
|
+
rescue ::RangeError
|
56
53
|
raise RecordNotFound.new("Couldn't find #{name} with an out of range value for '#{primary_key}'",
|
57
54
|
name, primary_key)
|
58
55
|
end
|
59
56
|
end
|
60
57
|
end
|
61
58
|
end
|
62
|
-
end
|
59
|
+
end
|
@@ -5,7 +5,7 @@ module ActiveRecord
|
|
5
5
|
private
|
6
6
|
|
7
7
|
silence_warnings do
|
8
|
-
def _update_record(attribute_names =
|
8
|
+
def _update_record(attribute_names = @attributes.keys) #:nodoc:
|
9
9
|
return super unless locking_enabled?
|
10
10
|
return 0 if attribute_names.empty?
|
11
11
|
|
@@ -25,18 +25,18 @@ module ActiveRecord
|
|
25
25
|
).where(
|
26
26
|
lock_col => previous_lock_value
|
27
27
|
).update_all(
|
28
|
-
attributes_for_update(attribute_names).map do |name|
|
29
|
-
|
30
|
-
|
28
|
+
Hash[attributes_for_update(attribute_names).map do |name|
|
29
|
+
[name, _read_attribute(name)]
|
30
|
+
end]
|
31
31
|
)
|
32
32
|
else
|
33
33
|
affected_rows = relation.where(
|
34
34
|
self.class.primary_key => id,
|
35
35
|
lock_col => previous_lock_value,
|
36
36
|
).update_all(
|
37
|
-
attributes_for_update(attribute_names).map do |name|
|
38
|
-
|
39
|
-
|
37
|
+
Hash[attributes_for_update(attribute_names).map do |name|
|
38
|
+
[name, _read_attribute(name)]
|
39
|
+
end]
|
40
40
|
)
|
41
41
|
end
|
42
42
|
|