activerecord 7.1.0 → 7.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/lib/active_record/attribute_methods/dirty.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1 -3
- data/lib/active_record/connection_adapters/postgresql/column.rb +14 -2
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +2 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
- data/lib/active_record/core.rb +21 -21
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/internal_metadata.rb +2 -0
- data/lib/active_record/migration/command_recorder.rb +4 -1
- data/lib/active_record/nested_attributes.rb +4 -6
- data/lib/active_record/railtie.rb +1 -1
- data/lib/active_record/relation/calculations.rb +16 -8
- data/lib/active_record/relation/query_methods.rb +1 -1
- data/lib/active_record/timestamp.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3595eee8065caff3100f00f5ce54d1b3a34935759766cb16b4d8229a57ebc97e
|
4
|
+
data.tar.gz: 5fbab431bcbc3b56cae5b2d8400c893071c72ccc7feea3eb6d9343418c650ec6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c75c3da922f3b0089112bb07c115787bedc1bb57a6e05aa04df893262554e09bf81e71898ac7ed24b1c80a00071818e14267cbffc2bb2b789755867b85f76d78
|
7
|
+
data.tar.gz: 5f6684e9a76e3a2a7156b687d4ac0701b9ddd840edd9c671f51031c534bdbd1e920b2aad65a479299383cb8555346a585e3167c353f33f95ecf8e05115438205
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## Rails 7.1.1 (October 11, 2023) ##
|
2
|
+
|
3
|
+
* Fix auto populating IDENTITY columns for PostgreSQL.
|
4
|
+
|
5
|
+
*fatkodima*
|
6
|
+
|
7
|
+
* Fix "ArgumentError: wrong number of arguments (given 3, expected 2)" when
|
8
|
+
down migrating `rename_table` in older migrations.
|
9
|
+
|
10
|
+
*fatkodima*
|
11
|
+
|
12
|
+
* Do not require the Action Text, Active Storage and Action Mailbox tables
|
13
|
+
to be present when running when running test on CI.
|
14
|
+
|
15
|
+
*Rafael Mendonça França*
|
16
|
+
|
17
|
+
|
1
18
|
## Rails 7.1.0 (October 05, 2023) ##
|
2
19
|
|
3
20
|
* No changes.
|
@@ -7,7 +7,7 @@ module ActiveRecord
|
|
7
7
|
# = Active Record Attribute Methods \Dirty
|
8
8
|
#
|
9
9
|
# Provides a way to track changes in your Active Record models. It adds all
|
10
|
-
# methods from ActiveModel::Dirty and adds database
|
10
|
+
# methods from ActiveModel::Dirty and adds database-specific methods.
|
11
11
|
#
|
12
12
|
# A newly created +Person+ object is unchanged:
|
13
13
|
#
|
@@ -983,7 +983,6 @@ module ActiveRecord
|
|
983
983
|
# Adds a reference. The reference column is a bigint by default,
|
984
984
|
# the <tt>:type</tt> option can be used to specify a different type.
|
985
985
|
# Optionally adds a +_type+ column, if <tt>:polymorphic</tt> option is provided.
|
986
|
-
# #add_reference and #add_belongs_to are acceptable.
|
987
986
|
#
|
988
987
|
# The +options+ hash can include the following keys:
|
989
988
|
# [<tt>:type</tt>]
|
@@ -1034,7 +1033,6 @@ module ActiveRecord
|
|
1034
1033
|
alias :add_belongs_to :add_reference
|
1035
1034
|
|
1036
1035
|
# Removes the reference(s). Also removes a +type+ column if one exists.
|
1037
|
-
# #remove_reference and #remove_belongs_to are acceptable.
|
1038
1036
|
#
|
1039
1037
|
# ====== Remove the reference
|
1040
1038
|
#
|
@@ -1400,7 +1398,7 @@ module ActiveRecord
|
|
1400
1398
|
|
1401
1399
|
limited = relation.reselect(values).distinct!
|
1402
1400
|
limited_ids = select_rows(limited.arel, "SQL").map do |results|
|
1403
|
-
results.last(Array(relation.primary_key).length) # ignores order values for MySQL and
|
1401
|
+
results.last(Array(relation.primary_key).length) # ignores order values for MySQL and PostgreSQL
|
1404
1402
|
end
|
1405
1403
|
|
1406
1404
|
if limited_ids.empty?
|
@@ -6,16 +6,24 @@ module ActiveRecord
|
|
6
6
|
class Column < ConnectionAdapters::Column # :nodoc:
|
7
7
|
delegate :oid, :fmod, to: :sql_type_metadata
|
8
8
|
|
9
|
-
def initialize(*, serial: nil, generated: nil, **)
|
9
|
+
def initialize(*, serial: nil, identity: nil, generated: nil, **)
|
10
10
|
super
|
11
11
|
@serial = serial
|
12
|
+
@identity = identity
|
12
13
|
@generated = generated
|
13
14
|
end
|
14
15
|
|
16
|
+
def identity?
|
17
|
+
@identity
|
18
|
+
end
|
19
|
+
|
15
20
|
def serial?
|
16
21
|
@serial
|
17
22
|
end
|
18
|
-
|
23
|
+
|
24
|
+
def auto_incremented_by_db?
|
25
|
+
serial? || identity?
|
26
|
+
end
|
19
27
|
|
20
28
|
def virtual?
|
21
29
|
# We assume every generated column is virtual, no matter the concrete type
|
@@ -41,12 +49,14 @@ module ActiveRecord
|
|
41
49
|
|
42
50
|
def init_with(coder)
|
43
51
|
@serial = coder["serial"]
|
52
|
+
@identity = coder["identity"]
|
44
53
|
@generated = coder["generated"]
|
45
54
|
super
|
46
55
|
end
|
47
56
|
|
48
57
|
def encode_with(coder)
|
49
58
|
coder["serial"] = @serial
|
59
|
+
coder["identity"] = @identity
|
50
60
|
coder["generated"] = @generated
|
51
61
|
super
|
52
62
|
end
|
@@ -54,6 +64,7 @@ module ActiveRecord
|
|
54
64
|
def ==(other)
|
55
65
|
other.is_a?(Column) &&
|
56
66
|
super &&
|
67
|
+
identity? == other.identity? &&
|
57
68
|
serial? == other.serial?
|
58
69
|
end
|
59
70
|
alias :eql? :==
|
@@ -61,6 +72,7 @@ module ActiveRecord
|
|
61
72
|
def hash
|
62
73
|
Column.hash ^
|
63
74
|
super.hash ^
|
75
|
+
identity?.hash ^
|
64
76
|
serial?.hash
|
65
77
|
end
|
66
78
|
end
|
@@ -15,7 +15,7 @@ module ActiveRecord
|
|
15
15
|
time = super
|
16
16
|
return time if time.is_a?(ActiveSupport::TimeWithZone) || !time.acts_like?(:time)
|
17
17
|
|
18
|
-
# While in UTC mode, the PG gem may not return times back in "UTC" even if they were provided to
|
18
|
+
# While in UTC mode, the PG gem may not return times back in "UTC" even if they were provided to PostgreSQL in UTC.
|
19
19
|
# We prefer times always in UTC, so here we convert back.
|
20
20
|
if is_utc?
|
21
21
|
time.getutc
|
@@ -908,7 +908,7 @@ module ActiveRecord
|
|
908
908
|
end
|
909
909
|
|
910
910
|
def new_column_from_field(table_name, field, _definitions)
|
911
|
-
column_name, type, default, notnull, oid, fmod, collation, comment, attgenerated = field
|
911
|
+
column_name, type, default, notnull, oid, fmod, collation, comment, identity, attgenerated = field
|
912
912
|
type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i)
|
913
913
|
default_value = extract_value_from_default(default)
|
914
914
|
|
@@ -931,6 +931,7 @@ module ActiveRecord
|
|
931
931
|
collation: collation,
|
932
932
|
comment: comment.presence,
|
933
933
|
serial: serial,
|
934
|
+
identity: identity.presence,
|
934
935
|
generated: attgenerated
|
935
936
|
)
|
936
937
|
end
|
@@ -1076,6 +1076,7 @@ module ActiveRecord
|
|
1076
1076
|
SELECT a.attname, format_type(a.atttypid, a.atttypmod),
|
1077
1077
|
pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
|
1078
1078
|
c.collname, col_description(a.attrelid, a.attnum) AS comment,
|
1079
|
+
a.attidentity AS identity,
|
1079
1080
|
#{supports_virtual_columns? ? 'attgenerated' : quote('')} as attgenerated
|
1080
1081
|
FROM pg_attribute a
|
1081
1082
|
LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
|
data/lib/active_record/core.rb
CHANGED
@@ -536,6 +536,27 @@ module ActiveRecord
|
|
536
536
|
coder["active_record_yaml_version"] = 2
|
537
537
|
end
|
538
538
|
|
539
|
+
##
|
540
|
+
# :method: slice
|
541
|
+
#
|
542
|
+
# :call-seq: slice(*methods)
|
543
|
+
#
|
544
|
+
# Returns a hash of the given methods with their names as keys and returned
|
545
|
+
# values as values.
|
546
|
+
#
|
547
|
+
#--
|
548
|
+
# Implemented by ActiveModel::Access#slice.
|
549
|
+
|
550
|
+
##
|
551
|
+
# :method: values_at
|
552
|
+
#
|
553
|
+
# :call-seq: values_at(*methods)
|
554
|
+
#
|
555
|
+
# Returns an array of the values returned by the given methods.
|
556
|
+
#
|
557
|
+
#--
|
558
|
+
# Implemented by ActiveModel::Access#values_at.
|
559
|
+
|
539
560
|
# Returns true if +comparison_object+ is the same exact object, or +comparison_object+
|
540
561
|
# is of the same type and +self+ has an ID and it is equal to +comparison_object.id+.
|
541
562
|
#
|
@@ -701,27 +722,6 @@ module ActiveRecord
|
|
701
722
|
end
|
702
723
|
end
|
703
724
|
|
704
|
-
##
|
705
|
-
# :method: values_at
|
706
|
-
#
|
707
|
-
# :call-seq: values_at(*methods)
|
708
|
-
#
|
709
|
-
# Returns an array of the values returned by the given methods.
|
710
|
-
#
|
711
|
-
#--
|
712
|
-
# Implemented by ActiveModel::Access#values_at.
|
713
|
-
|
714
|
-
##
|
715
|
-
# :method: slice
|
716
|
-
#
|
717
|
-
# :call-seq: slice(*methods)
|
718
|
-
#
|
719
|
-
# Returns a hash of the given methods with their names as keys and returned
|
720
|
-
# values as values.
|
721
|
-
#
|
722
|
-
#--
|
723
|
-
# Implemented by ActiveModel::Access#slice.
|
724
|
-
|
725
725
|
private
|
726
726
|
# +Array#flatten+ will call +#to_ary+ (recursively) on each of the elements of
|
727
727
|
# the array, and then rescues from the possible +NoMethodError+. If those elements are
|
@@ -64,6 +64,8 @@ module ActiveRecord
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def create_table_and_set_flags(environment, schema_sha1 = nil)
|
67
|
+
return unless enabled?
|
68
|
+
|
67
69
|
create_table
|
68
70
|
update_or_create_entry(:environment, environment)
|
69
71
|
update_or_create_entry(:schema_sha1, schema_sha1) if schema_sha1
|
@@ -206,7 +206,10 @@ module ActiveRecord
|
|
206
206
|
end
|
207
207
|
|
208
208
|
def invert_rename_table(args)
|
209
|
-
|
209
|
+
old_name, new_name, options = args
|
210
|
+
args = [new_name, old_name]
|
211
|
+
args << options if options
|
212
|
+
[:rename_table, args]
|
210
213
|
end
|
211
214
|
|
212
215
|
def invert_remove_column(args)
|
@@ -283,13 +283,11 @@ module ActiveRecord
|
|
283
283
|
#
|
284
284
|
# === Creating forms with nested attributes
|
285
285
|
#
|
286
|
-
# Use ActionView::Helpers::FormHelper#fields_for to create form elements
|
287
|
-
#
|
286
|
+
# Use ActionView::Helpers::FormHelper#fields_for to create form elements for
|
287
|
+
# nested attributes.
|
288
288
|
#
|
289
|
-
#
|
290
|
-
#
|
291
|
-
# If you are using ActionView::Helpers::FormHelper#fields_for, your integration
|
292
|
-
# tests should replicate the HTML structure it provides. For example;
|
289
|
+
# Integration test params should reflect the structure of the form. For
|
290
|
+
# example:
|
293
291
|
#
|
294
292
|
# post members_path, params: {
|
295
293
|
# member: {
|
@@ -398,7 +398,7 @@ To keep using the current cache store, you can turn off cache versioning entirel
|
|
398
398
|
end
|
399
399
|
|
400
400
|
ActiveSupport.on_load(:active_record_fixture_set) do
|
401
|
-
# Encrypt
|
401
|
+
# Encrypt Active Record fixtures
|
402
402
|
if ActiveRecord::Encryption.config.encrypt_fixtures
|
403
403
|
ActiveRecord::Fixture.prepend ActiveRecord::Encryption::EncryptedFixtures
|
404
404
|
end
|
@@ -93,7 +93,8 @@ module ActiveRecord
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
# Same as
|
96
|
+
# Same as #count, but performs the query asynchronously and returns an
|
97
|
+
# ActiveRecord::Promise.
|
97
98
|
def async_count(column_name = nil)
|
98
99
|
async.count(column_name)
|
99
100
|
end
|
@@ -106,7 +107,8 @@ module ActiveRecord
|
|
106
107
|
calculate(:average, column_name)
|
107
108
|
end
|
108
109
|
|
109
|
-
# Same as
|
110
|
+
# Same as #average, but performs the query asynchronously and returns an
|
111
|
+
# ActiveRecord::Promise.
|
110
112
|
def async_average(column_name)
|
111
113
|
async.average(column_name)
|
112
114
|
end
|
@@ -120,7 +122,8 @@ module ActiveRecord
|
|
120
122
|
calculate(:minimum, column_name)
|
121
123
|
end
|
122
124
|
|
123
|
-
# Same as
|
125
|
+
# Same as #minimum, but performs the query asynchronously and returns an
|
126
|
+
# ActiveRecord::Promise.
|
124
127
|
def async_minimum(column_name)
|
125
128
|
async.minimum(column_name)
|
126
129
|
end
|
@@ -134,7 +137,8 @@ module ActiveRecord
|
|
134
137
|
calculate(:maximum, column_name)
|
135
138
|
end
|
136
139
|
|
137
|
-
# Same as
|
140
|
+
# Same as #maximum, but performs the query asynchronously and returns an
|
141
|
+
# ActiveRecord::Promise.
|
138
142
|
def async_maximum(column_name)
|
139
143
|
async.maximum(column_name)
|
140
144
|
end
|
@@ -152,7 +156,8 @@ module ActiveRecord
|
|
152
156
|
end
|
153
157
|
end
|
154
158
|
|
155
|
-
# Same as
|
159
|
+
# Same as #sum, but performs the query asynchronously and returns an
|
160
|
+
# ActiveRecord::Promise.
|
156
161
|
def async_sum(identity_or_column = nil)
|
157
162
|
async.sum(identity_or_column)
|
158
163
|
end
|
@@ -287,7 +292,8 @@ module ActiveRecord
|
|
287
292
|
end
|
288
293
|
end
|
289
294
|
|
290
|
-
# Same as
|
295
|
+
# Same as #pluck, but performs the query asynchronously and returns an
|
296
|
+
# ActiveRecord::Promise.
|
291
297
|
def async_pluck(*column_names)
|
292
298
|
async.pluck(*column_names)
|
293
299
|
end
|
@@ -315,7 +321,8 @@ module ActiveRecord
|
|
315
321
|
limit(1).pluck(*column_names).then(&:first)
|
316
322
|
end
|
317
323
|
|
318
|
-
# Same as
|
324
|
+
# Same as #pick, but performs the query asynchronously and returns an
|
325
|
+
# ActiveRecord::Promise.
|
319
326
|
def async_pick(*column_names)
|
320
327
|
async.pick(*column_names)
|
321
328
|
end
|
@@ -358,7 +365,8 @@ module ActiveRecord
|
|
358
365
|
result.then { |result| type_cast_pluck_values(result, columns) }
|
359
366
|
end
|
360
367
|
|
361
|
-
# Same as
|
368
|
+
# Same as #ids, but performs the query asynchronously and returns an
|
369
|
+
# ActiveRecord::Promise.
|
362
370
|
def async_ids
|
363
371
|
async.ids
|
364
372
|
end
|
@@ -588,7 +588,7 @@ module ActiveRecord
|
|
588
588
|
# User.order(Arel.sql('end_date - start_date'))
|
589
589
|
# # SELECT "users".* FROM "users" ORDER BY end_date - start_date
|
590
590
|
#
|
591
|
-
# Custom query syntax, like JSON columns for
|
591
|
+
# Custom query syntax, like JSON columns for PostgreSQL, is supported in this way.
|
592
592
|
#
|
593
593
|
# User.order(Arel.sql("payload->>'kind'"))
|
594
594
|
# # SELECT "users".* FROM "users" ORDER BY payload->>'kind'
|
@@ -30,7 +30,7 @@ module ActiveRecord
|
|
30
30
|
#
|
31
31
|
# ActiveRecord::Base.time_zone_aware_types = [:datetime]
|
32
32
|
#
|
33
|
-
# You can also add database
|
33
|
+
# You can also add database-specific timezone aware types. For example, for PostgreSQL:
|
34
34
|
#
|
35
35
|
# ActiveRecord::Base.time_zone_aware_types += [:tsrange, :tstzrange]
|
36
36
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.1.
|
4
|
+
version: 7.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 7.1.
|
19
|
+
version: 7.1.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 7.1.
|
26
|
+
version: 7.1.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activemodel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 7.1.
|
33
|
+
version: 7.1.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 7.1.
|
40
|
+
version: 7.1.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: timeout
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -469,10 +469,10 @@ licenses:
|
|
469
469
|
- MIT
|
470
470
|
metadata:
|
471
471
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
472
|
-
changelog_uri: https://github.com/rails/rails/blob/v7.1.
|
473
|
-
documentation_uri: https://api.rubyonrails.org/v7.1.
|
472
|
+
changelog_uri: https://github.com/rails/rails/blob/v7.1.1/activerecord/CHANGELOG.md
|
473
|
+
documentation_uri: https://api.rubyonrails.org/v7.1.1/
|
474
474
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
475
|
-
source_code_uri: https://github.com/rails/rails/tree/v7.1.
|
475
|
+
source_code_uri: https://github.com/rails/rails/tree/v7.1.1/activerecord
|
476
476
|
rubygems_mfa_required: 'true'
|
477
477
|
post_install_message:
|
478
478
|
rdoc_options:
|