activerecord 7.1.0 → 7.1.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.
- 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:
|