activerecord 7.0.2.4 → 7.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +47 -0
- data/lib/active_record/associations/collection_association.rb +1 -1
- data/lib/active_record/associations/collection_proxy.rb +1 -1
- data/lib/active_record/associations.rb +9 -9
- data/lib/active_record/attribute_methods/serialization.rb +34 -50
- data/lib/active_record/attribute_methods.rb +1 -1
- data/lib/active_record/base.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +4 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +3 -3
- data/lib/active_record/connection_adapters/abstract_adapter.rb +5 -5
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +4 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +3 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +19 -1
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +3 -3
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +1 -1
- data/lib/active_record/connection_handling.rb +2 -2
- data/lib/active_record/core.rb +3 -3
- data/lib/active_record/encryption/configurable.rb +8 -2
- data/lib/active_record/encryption/contexts.rb +3 -3
- data/lib/active_record/encryption/derived_secret_key_provider.rb +1 -1
- data/lib/active_record/encryption/deterministic_key_provider.rb +1 -1
- data/lib/active_record/encryption/encryptable_record.rb +2 -4
- data/lib/active_record/encryption/encrypted_attribute_type.rb +2 -2
- data/lib/active_record/encryption/encryptor.rb +7 -7
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +3 -3
- data/lib/active_record/encryption/extended_deterministic_queries.rb +4 -4
- data/lib/active_record/encryption/scheme.rb +1 -1
- data/lib/active_record/enum.rb +1 -1
- data/lib/active_record/fixtures.rb +4 -4
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/locking/pessimistic.rb +3 -3
- data/lib/active_record/log_subscriber.rb +10 -5
- data/lib/active_record/middleware/database_selector.rb +13 -6
- data/lib/active_record/middleware/shard_selector.rb +4 -4
- data/lib/active_record/migration/command_recorder.rb +3 -3
- data/lib/active_record/migration/compatibility.rb +7 -26
- data/lib/active_record/migration.rb +5 -4
- data/lib/active_record/model_schema.rb +1 -1
- data/lib/active_record/persistence.rb +9 -8
- data/lib/active_record/querying.rb +1 -1
- data/lib/active_record/railtie.rb +14 -0
- data/lib/active_record/railties/databases.rake +1 -1
- data/lib/active_record/reflection.rb +6 -0
- data/lib/active_record/relation/batches.rb +3 -3
- data/lib/active_record/relation/query_methods.rb +8 -1
- data/lib/active_record/relation.rb +6 -6
- data/lib/active_record/sanitization.rb +6 -5
- data/lib/active_record/scoping/default.rb +1 -5
- data/lib/active_record/serialization.rb +5 -0
- data/lib/active_record/signed_id.rb +1 -1
- data/lib/active_record/tasks/database_tasks.rb +26 -21
- data/lib/active_record/tasks/postgresql_database_tasks.rb +1 -2
- data/lib/active_record/test_fixtures.rb +3 -0
- data/lib/active_record/translation.rb +1 -1
- data/lib/active_record/validations/associated.rb +3 -3
- data/lib/active_record/validations/presence.rb +2 -2
- data/lib/active_record/validations/uniqueness.rb +3 -3
- data/lib/active_record/version.rb +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5eadd3ac082cbc3b4f816198ddbd229f92346a77e9cc29d2410f1a9d1e726705
|
4
|
+
data.tar.gz: c3cf3a52ebe5659ea0032e88379f6f0a642d9cd5e1e3866a84bc65b801fecc12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa2df41f5f52609acfdd306ef594bd2e7a914fa3830a413d94a061041afe17be283f339e2e16bb47569884893c405d436cc0f56b2be5a57fe09ed3d02b7cdac5
|
7
|
+
data.tar.gz: c846af2dfd2f225fb83632b71154da368cbd20da52276b7dafa7517196f33f9123573d3d610e563b00df08a3d2851e7bba86d08bf29babeb50994c321b2c81e9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
## Rails 7.0.3 (May 09, 2022) ##
|
2
|
+
|
3
|
+
* Some internal housekeeping on reloads could break custom `respond_to?`
|
4
|
+
methods in class objects that referenced reloadable constants. See
|
5
|
+
[#44125](https://github.com/rails/rails/issues/44125) for details.
|
6
|
+
|
7
|
+
*Xavier Noria*
|
8
|
+
|
9
|
+
* Fixed MariaDB default function support.
|
10
|
+
|
11
|
+
Defaults would be written wrong in "db/schema.rb" and not work correctly
|
12
|
+
if using `db:schema:load`. Further more the function name would be
|
13
|
+
added as string content when saving new records.
|
14
|
+
|
15
|
+
*kaspernj*
|
16
|
+
|
17
|
+
* Fix `remove_foreign_key` with `:if_exists` option when foreign key actually exists.
|
18
|
+
|
19
|
+
*fatkodima*
|
20
|
+
|
21
|
+
* Remove `--no-comments` flag in structure dumps for PostgreSQL
|
22
|
+
|
23
|
+
This broke some apps that used custom schema comments. If you don't want
|
24
|
+
comments in your structure dump, you can use:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
ActiveRecord::Tasks::DatabaseTasks.structure_dump_flags = ['--no-comments']
|
28
|
+
```
|
29
|
+
|
30
|
+
*Alex Ghiculescu*
|
31
|
+
|
32
|
+
* Use the model name as a prefix when filtering encrypted attributes from logs.
|
33
|
+
|
34
|
+
For example, when encrypting `Person#name` it will add `person.name` as a filter
|
35
|
+
parameter, instead of just `name`. This prevents unintended filtering of parameters
|
36
|
+
with a matching name in other models.
|
37
|
+
|
38
|
+
*Jorge Manrubia*
|
39
|
+
|
40
|
+
* Fix quoting of `ActiveSupport::Duration` and `Rational` numbers in the MySQL adapter.
|
41
|
+
|
42
|
+
*Kevin McPhillips*
|
43
|
+
|
44
|
+
* Fix `change_column_comment` to preserve column's AUTO_INCREMENT in the MySQL adapter
|
45
|
+
|
46
|
+
*fatkodima*
|
47
|
+
|
1
48
|
## Rails 7.0.2.4 (April 26, 2022) ##
|
2
49
|
|
3
50
|
* No changes.
|
@@ -180,7 +180,7 @@ module ActiveRecord
|
|
180
180
|
end
|
181
181
|
|
182
182
|
# Deletes the +records+ and removes them from this association calling
|
183
|
-
# +before_remove
|
183
|
+
# +before_remove+, +after_remove+, +before_destroy+ and +after_destroy+ callbacks.
|
184
184
|
#
|
185
185
|
# Note that this method removes records from the database ignoring the
|
186
186
|
# +:dependent+ option.
|
@@ -475,7 +475,7 @@ module ActiveRecord
|
|
475
475
|
|
476
476
|
# Deletes the records of the collection directly from the database
|
477
477
|
# ignoring the +:dependent+ option. Records are instantiated and it
|
478
|
-
# invokes +before_remove+, +after_remove
|
478
|
+
# invokes +before_remove+, +after_remove+, +before_destroy+, and
|
479
479
|
# +after_destroy+ callbacks.
|
480
480
|
#
|
481
481
|
# class Person < ActiveRecord::Base
|
@@ -432,7 +432,7 @@ module ActiveRecord
|
|
432
432
|
#
|
433
433
|
# == Cardinality and associations
|
434
434
|
#
|
435
|
-
# Active Record associations can be used to describe one-to-one, one-to-many and many-to-many
|
435
|
+
# Active Record associations can be used to describe one-to-one, one-to-many, and many-to-many
|
436
436
|
# relationships between models. Each model uses an association to describe its role in
|
437
437
|
# the relation. The #belongs_to association is always used in the model that has
|
438
438
|
# the foreign key.
|
@@ -586,7 +586,7 @@ module ActiveRecord
|
|
586
586
|
# has_many :birthday_events, ->(user) { where(starts_on: user.birthday) }, class_name: 'Event'
|
587
587
|
# end
|
588
588
|
#
|
589
|
-
# Note: Joining, eager loading and preloading of these associations is not possible.
|
589
|
+
# Note: Joining, eager loading, and preloading of these associations is not possible.
|
590
590
|
# These operations happen before instance creation and the scope will be called with a +nil+ argument.
|
591
591
|
#
|
592
592
|
# == Association callbacks
|
@@ -618,7 +618,7 @@ module ActiveRecord
|
|
618
618
|
# after_remove: :log_after_remove
|
619
619
|
# end
|
620
620
|
#
|
621
|
-
# Possible callbacks are: +before_add+, +after_add+, +before_remove
|
621
|
+
# Possible callbacks are: +before_add+, +after_add+, +before_remove+, and +after_remove+.
|
622
622
|
#
|
623
623
|
# If any of the +before_add+ callbacks throw an exception, the object will not be
|
624
624
|
# added to the collection.
|
@@ -1332,7 +1332,7 @@ module ActiveRecord
|
|
1332
1332
|
# === Extensions
|
1333
1333
|
#
|
1334
1334
|
# The +extension+ argument allows you to pass a block into a has_many
|
1335
|
-
# association. This is useful for adding new finders, creators and other
|
1335
|
+
# association. This is useful for adding new finders, creators, and other
|
1336
1336
|
# factory-type methods to be used as part of the association.
|
1337
1337
|
#
|
1338
1338
|
# Extension examples:
|
@@ -1415,8 +1415,8 @@ module ActiveRecord
|
|
1415
1415
|
# [:disable_joins]
|
1416
1416
|
# Specifies whether joins should be skipped for an association. If set to true, two or more queries
|
1417
1417
|
# will be generated. Note that in some cases, if order or limit is applied, it will be done in-memory
|
1418
|
-
# due to database limitations. This option is only applicable on
|
1419
|
-
#
|
1418
|
+
# due to database limitations. This option is only applicable on <tt>has_many :through</tt> associations as
|
1419
|
+
# +has_many+ alone do not perform a join.
|
1420
1420
|
# [:source]
|
1421
1421
|
# Specifies the source association name used by #has_many <tt>:through</tt> queries.
|
1422
1422
|
# Only use it if the name cannot be inferred from the association.
|
@@ -1580,8 +1580,8 @@ module ActiveRecord
|
|
1580
1580
|
# [:disable_joins]
|
1581
1581
|
# Specifies whether joins should be skipped for an association. If set to true, two or more queries
|
1582
1582
|
# will be generated. Note that in some cases, if order or limit is applied, it will be done in-memory
|
1583
|
-
# due to database limitations. This option is only applicable on
|
1584
|
-
#
|
1583
|
+
# due to database limitations. This option is only applicable on <tt>has_one :through</tt> associations as
|
1584
|
+
# +has_one+ alone does not perform a join.
|
1585
1585
|
# [:source]
|
1586
1586
|
# Specifies the source association name used by #has_one <tt>:through</tt> queries.
|
1587
1587
|
# Only use it if the name cannot be inferred from the association.
|
@@ -1904,7 +1904,7 @@ module ActiveRecord
|
|
1904
1904
|
#
|
1905
1905
|
# The +extension+ argument allows you to pass a block into a
|
1906
1906
|
# has_and_belongs_to_many association. This is useful for adding new
|
1907
|
-
# finders, creators and other factory-type methods to be used as part of
|
1907
|
+
# finders, creators, and other factory-type methods to be used as part of
|
1908
1908
|
# the association.
|
1909
1909
|
#
|
1910
1910
|
# Extension examples:
|
@@ -24,38 +24,6 @@ module ActiveRecord
|
|
24
24
|
# The serialization format may be YAML, JSON, or any custom format using a
|
25
25
|
# custom coder class.
|
26
26
|
#
|
27
|
-
# === Serialization formats
|
28
|
-
#
|
29
|
-
# serialize attr_name [, class_name_or_coder]
|
30
|
-
#
|
31
|
-
# | | database storage |
|
32
|
-
# class_name_or_coder | attribute read/write type | serialized | NULL |
|
33
|
-
# ---------------------+---------------------------+------------+--------+
|
34
|
-
# <not given> | any value that supports | YAML | |
|
35
|
-
# | .to_yaml | | |
|
36
|
-
# | | | |
|
37
|
-
# Array | Array ** | YAML | [] |
|
38
|
-
# | | | |
|
39
|
-
# Hash | Hash ** | YAML | {} |
|
40
|
-
# | | | |
|
41
|
-
# JSON | any value that supports | JSON | |
|
42
|
-
# | .to_json | | |
|
43
|
-
# | | | |
|
44
|
-
# <custom coder class> | any value supported by | custom | custom |
|
45
|
-
# | the custom coder class | | |
|
46
|
-
#
|
47
|
-
# ** If +class_name_or_coder+ is +Array+ or +Hash+, values retrieved will
|
48
|
-
# always be of that type, and any value assigned must be of that type or
|
49
|
-
# +SerializationTypeMismatch+ will be raised.
|
50
|
-
#
|
51
|
-
# ==== Custom coders
|
52
|
-
# A custom coder class or module may be given. This must have +self.load+
|
53
|
-
# and +self.dump+ class/module methods. <tt>self.dump(object)</tt> will be called
|
54
|
-
# to serialize an object and should return the serialized value to be
|
55
|
-
# stored in the database (+nil+ to store as +NULL+). <tt>self.load(string)</tt>
|
56
|
-
# will be called to reverse the process and load (unserialize) from the
|
57
|
-
# database.
|
58
|
-
#
|
59
27
|
# Keep in mind that database adapters handle certain serialization tasks
|
60
28
|
# for you. For instance: +json+ and +jsonb+ types in PostgreSQL will be
|
61
29
|
# converted between JSON object/array syntax and Ruby +Hash+ or +Array+
|
@@ -67,55 +35,71 @@ module ActiveRecord
|
|
67
35
|
#
|
68
36
|
# ==== Parameters
|
69
37
|
#
|
70
|
-
# * +attr_name+ - The
|
71
|
-
# * +class_name_or_coder+ - Optional
|
72
|
-
#
|
73
|
-
#
|
38
|
+
# * +attr_name+ - The name of the attribute to serialize.
|
39
|
+
# * +class_name_or_coder+ - Optional. May be one of the following:
|
40
|
+
# * <em>default</em> - The attribute value will be serialized as YAML.
|
41
|
+
# The attribute value must respond to +to_yaml+.
|
42
|
+
# * +Array+ - The attribute value will be serialized as YAML, but an
|
43
|
+
# empty +Array+ will be serialized as +NULL+. The attribute value
|
44
|
+
# must be an +Array+.
|
45
|
+
# * +Hash+ - The attribute value will be serialized as YAML, but an
|
46
|
+
# empty +Hash+ will be serialized as +NULL+. The attribute value
|
47
|
+
# must be a +Hash+.
|
48
|
+
# * +JSON+ - The attribute value will be serialized as JSON. The
|
49
|
+
# attribute value must respond to +to_json+.
|
50
|
+
# * <em>custom coder</em> - The attribute value will be serialized
|
51
|
+
# using the coder's <tt>dump(value)</tt> method, and will be
|
52
|
+
# deserialized using the coder's <tt>load(string)</tt> method. The
|
53
|
+
# +dump+ method may return +nil+ to serialize the value as +NULL+.
|
74
54
|
#
|
75
55
|
# ==== Options
|
76
56
|
#
|
77
|
-
#
|
78
|
-
# is not passed, the previous default value (if any) will
|
79
|
-
# Otherwise, the default will be +nil+.
|
57
|
+
# * +:default+ - The default value to use when no value is provided. If
|
58
|
+
# this option is not passed, the previous default value (if any) will
|
59
|
+
# be used. Otherwise, the default will be +nil+.
|
60
|
+
#
|
61
|
+
# ==== Examples
|
80
62
|
#
|
81
|
-
#
|
63
|
+
# ===== Serialize the +preferences+ attribute using YAML
|
82
64
|
#
|
83
|
-
# # Serialize a preferences attribute using YAML coder.
|
84
65
|
# class User < ActiveRecord::Base
|
85
66
|
# serialize :preferences
|
86
67
|
# end
|
87
68
|
#
|
88
|
-
#
|
69
|
+
# ===== Serialize the +preferences+ attribute using JSON
|
70
|
+
#
|
89
71
|
# class User < ActiveRecord::Base
|
90
72
|
# serialize :preferences, JSON
|
91
73
|
# end
|
92
74
|
#
|
93
|
-
#
|
75
|
+
# ===== Serialize the +preferences+ +Hash+ using YAML
|
76
|
+
#
|
94
77
|
# class User < ActiveRecord::Base
|
95
78
|
# serialize :preferences, Hash
|
96
79
|
# end
|
97
80
|
#
|
98
|
-
#
|
81
|
+
# ===== Serialize the +preferences+ attribute using a custom coder
|
82
|
+
#
|
99
83
|
# class Rot13JSON
|
100
84
|
# def self.rot13(string)
|
101
85
|
# string.tr("a-zA-Z", "n-za-mN-ZA-M")
|
102
86
|
# end
|
103
87
|
#
|
104
|
-
# #
|
105
|
-
# def self.dump(
|
106
|
-
# ActiveSupport::JSON.
|
88
|
+
# # Serializes an attribute value to a string that will be stored in the database.
|
89
|
+
# def self.dump(value)
|
90
|
+
# rot13(ActiveSupport::JSON.dump(value))
|
107
91
|
# end
|
108
92
|
#
|
109
|
-
# #
|
110
|
-
# # back into its original value
|
93
|
+
# # Deserializes a string from the database to an attribute value.
|
111
94
|
# def self.load(string)
|
112
|
-
# ActiveSupport::JSON.
|
95
|
+
# ActiveSupport::JSON.load(rot13(string))
|
113
96
|
# end
|
114
97
|
# end
|
115
98
|
#
|
116
99
|
# class User < ActiveRecord::Base
|
117
100
|
# serialize :preferences, Rot13JSON
|
118
101
|
# end
|
102
|
+
#
|
119
103
|
def serialize(attr_name, class_name_or_coder = Object, **options)
|
120
104
|
# When ::JSON is used, force it to go through the Active Support JSON encoder
|
121
105
|
# to ensure special objects (e.g. Active Record models) are dumped correctly
|
@@ -97,7 +97,7 @@ module ActiveRecord
|
|
97
97
|
super
|
98
98
|
else
|
99
99
|
# If ThisClass < ... < SomeSuperClass < ... < Base and SomeSuperClass
|
100
|
-
# defines its own attribute method, then we don't want to
|
100
|
+
# defines its own attribute method, then we don't want to override that.
|
101
101
|
defined = method_defined_within?(method_name, superclass, Base) &&
|
102
102
|
! superclass.instance_method(method_name).owner.is_a?(GeneratedAttributeMethods)
|
103
103
|
defined || super
|
data/lib/active_record/base.rb
CHANGED
@@ -137,7 +137,7 @@ module ActiveRecord # :nodoc:
|
|
137
137
|
# anonymous = User.new(name: "")
|
138
138
|
# anonymous.name? # => false
|
139
139
|
#
|
140
|
-
# Query methods will also respect any
|
140
|
+
# Query methods will also respect any overrides of default accessors:
|
141
141
|
#
|
142
142
|
# class User
|
143
143
|
# # Has admin boolean column
|
@@ -151,8 +151,8 @@ module ActiveRecord # :nodoc:
|
|
151
151
|
# user.read_attribute(:admin) # => true, gets the column value
|
152
152
|
# user[:admin] # => true, also gets the column value
|
153
153
|
#
|
154
|
-
# user.admin # => false, due to the getter
|
155
|
-
# user.admin? # => false, due to the getter
|
154
|
+
# user.admin # => false, due to the getter override
|
155
|
+
# user.admin? # => false, due to the getter override
|
156
156
|
#
|
157
157
|
# == Accessing attributes before they have been typecasted
|
158
158
|
#
|
@@ -40,7 +40,7 @@ module ActiveRecord
|
|
40
40
|
# but the Book model connects to a separate database called "library_db"
|
41
41
|
# (this can even be a database on a different machine).
|
42
42
|
#
|
43
|
-
# Book, ScaryBook and GoodBook will all use the same connection pool to
|
43
|
+
# Book, ScaryBook, and GoodBook will all use the same connection pool to
|
44
44
|
# "library_db" while Author, BankAccount, and any other models you create
|
45
45
|
# will use the default connection pool to "my_application".
|
46
46
|
#
|
@@ -202,6 +202,10 @@ module ActiveRecord
|
|
202
202
|
|
203
203
|
def index_options(table_name)
|
204
204
|
index_options = as_options(index)
|
205
|
+
|
206
|
+
# legacy reference index names are used on versions 6.0 and earlier
|
207
|
+
return index_options if options[:_uses_legacy_reference_index_name]
|
208
|
+
|
205
209
|
index_options[:name] ||= polymorphic_index_name(table_name) if polymorphic
|
206
210
|
index_options
|
207
211
|
end
|
@@ -1071,9 +1071,9 @@ module ActiveRecord
|
|
1071
1071
|
# [<tt>:name</tt>]
|
1072
1072
|
# The constraint name. Defaults to <tt>fk_rails_<identifier></tt>.
|
1073
1073
|
# [<tt>:on_delete</tt>]
|
1074
|
-
# Action that happens <tt>ON DELETE</tt>. Valid values are +:nullify+, +:cascade
|
1074
|
+
# Action that happens <tt>ON DELETE</tt>. Valid values are +:nullify+, +:cascade+, and +:restrict+
|
1075
1075
|
# [<tt>:on_update</tt>]
|
1076
|
-
# Action that happens <tt>ON UPDATE</tt>. Valid values are +:nullify+, +:cascade
|
1076
|
+
# Action that happens <tt>ON UPDATE</tt>. Valid values are +:nullify+, +:cascade+, and +:restrict+
|
1077
1077
|
# [<tt>:if_not_exists</tt>]
|
1078
1078
|
# Specifies if the foreign key already exists to not try to re-add it. This will avoid
|
1079
1079
|
# duplicate column errors.
|
@@ -1125,7 +1125,7 @@ module ActiveRecord
|
|
1125
1125
|
# The name of the table that contains the referenced primary key.
|
1126
1126
|
def remove_foreign_key(from_table, to_table = nil, **options)
|
1127
1127
|
return unless supports_foreign_keys?
|
1128
|
-
return if options
|
1128
|
+
return if options.delete(:if_exists) == true && !foreign_key_exists?(from_table, to_table)
|
1129
1129
|
|
1130
1130
|
fk_name_to_delete = foreign_key_for!(from_table, to_table: to_table, **options).name
|
1131
1131
|
|
@@ -36,7 +36,7 @@ module ActiveRecord
|
|
36
36
|
include Savepoints
|
37
37
|
|
38
38
|
SIMPLE_INT = /\A\d+\z/
|
39
|
-
COMMENT_REGEX = %r{(?:--.*\n)
|
39
|
+
COMMENT_REGEX = %r{(?:--.*\n)|/\*(?:[^*]|\*[^/])*\*/}m
|
40
40
|
|
41
41
|
attr_accessor :pool
|
42
42
|
attr_reader :visitor, :owner, :logger, :lock
|
@@ -224,14 +224,14 @@ module ActiveRecord
|
|
224
224
|
@pool.connection_class
|
225
225
|
end
|
226
226
|
|
227
|
-
# The role (
|
228
|
-
# non-multi role application,
|
227
|
+
# The role (e.g. +:writing+) for the current connection. In a
|
228
|
+
# non-multi role application, +:writing+ is returned.
|
229
229
|
def role
|
230
230
|
@pool.role
|
231
231
|
end
|
232
232
|
|
233
|
-
# The shard (
|
234
|
-
# a non-sharded application,
|
233
|
+
# The shard (e.g. +:default+) for the current connection. In
|
234
|
+
# a non-sharded application, +:default+ is returned.
|
235
235
|
def shard
|
236
236
|
@pool.shard
|
237
237
|
end
|
@@ -711,6 +711,10 @@ module ActiveRecord
|
|
711
711
|
options[:comment] = column.comment
|
712
712
|
end
|
713
713
|
|
714
|
+
unless options.key?(:auto_increment)
|
715
|
+
options[:auto_increment] = column.auto_increment?
|
716
|
+
end
|
717
|
+
|
714
718
|
td = create_table_definition(table_name)
|
715
719
|
cd = td.new_column_definition(column.name, type, **options)
|
716
720
|
schema_creation.accept(ChangeColumnDefinition.new(cd, column.name))
|
@@ -158,7 +158,21 @@ module ActiveRecord
|
|
158
158
|
MySQL::TableDefinition.new(self, name, **options)
|
159
159
|
end
|
160
160
|
|
161
|
+
def default_type(table_name, field_name)
|
162
|
+
match = create_table_info(table_name).match(/`#{field_name}` (.+) DEFAULT ('|\d+|[A-z]+)/)
|
163
|
+
default_pre = match[2] if match
|
164
|
+
|
165
|
+
if default_pre == "'"
|
166
|
+
:string
|
167
|
+
elsif default_pre&.match?(/^\d+$/)
|
168
|
+
:integer
|
169
|
+
elsif default_pre&.match?(/^[A-z]+$/)
|
170
|
+
:function
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
161
174
|
def new_column_from_field(table_name, field)
|
175
|
+
field_name = field.fetch(:Field)
|
162
176
|
type_metadata = fetch_type_metadata(field[:Type], field[:Extra])
|
163
177
|
default, default_function = field[:Default], nil
|
164
178
|
|
@@ -168,9 +182,13 @@ module ActiveRecord
|
|
168
182
|
elsif type_metadata.extra == "DEFAULT_GENERATED"
|
169
183
|
default = +"(#{default})" unless default.start_with?("(")
|
170
184
|
default, default_function = nil, default
|
171
|
-
elsif type_metadata.type == :text && default
|
185
|
+
elsif type_metadata.type == :text && default&.start_with?("'")
|
172
186
|
# strip and unescape quotes
|
173
187
|
default = default[1...-1].gsub("\\'", "'")
|
188
|
+
elsif default&.match?(/\A\d/)
|
189
|
+
# Its a number so we can skip the query to check if it is a function
|
190
|
+
elsif default && default_type(table_name, field_name) == :function
|
191
|
+
default, default_function = nil, default
|
174
192
|
end
|
175
193
|
|
176
194
|
MySQL::Column.new(
|
@@ -528,8 +528,10 @@ module ActiveRecord
|
|
528
528
|
SELECT conname, pg_get_constraintdef(c.oid, true) AS constraintdef, c.convalidated AS valid
|
529
529
|
FROM pg_constraint c
|
530
530
|
JOIN pg_class t ON c.conrelid = t.oid
|
531
|
+
JOIN pg_namespace n ON n.oid = c.connamespace
|
531
532
|
WHERE c.contype = 'c'
|
532
533
|
AND t.relname = #{scope[:name]}
|
534
|
+
AND n.nspname = #{scope[:schema]}
|
533
535
|
SQL
|
534
536
|
|
535
537
|
check_info.map do |row|
|
@@ -104,7 +104,7 @@ module ActiveRecord
|
|
104
104
|
|
105
105
|
##
|
106
106
|
# :singleton-method:
|
107
|
-
# PostgreSQL supports multiple types for DateTimes. By default if you use
|
107
|
+
# PostgreSQL supports multiple types for DateTimes. By default, if you use +datetime+
|
108
108
|
# in migrations, Rails will translate this to a PostgreSQL "timestamp without time zone".
|
109
109
|
# Change this in an initializer to use another NATIVE_DATABASE_TYPES. For example, to
|
110
110
|
# store DateTimes as "timestamp with time zone":
|
@@ -116,8 +116,8 @@ module ActiveRecord
|
|
116
116
|
# ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:my_custom_type] = { name: "my_custom_type_name" }
|
117
117
|
# ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type = :my_custom_type
|
118
118
|
#
|
119
|
-
# If you're using
|
120
|
-
# setting, you should immediately run bin/rails db:migrate to update the types in your schema.rb.
|
119
|
+
# If you're using +:ruby+ as your +config.active_record.schema_format+ and you change this
|
120
|
+
# setting, you should immediately run <tt>bin/rails db:migrate</tt> to update the types in your schema.rb.
|
121
121
|
class_attribute :datetime_type, default: :timestamp
|
122
122
|
|
123
123
|
NATIVE_DATABASE_TYPES = {
|
@@ -60,7 +60,7 @@ module ActiveRecord
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def remove_foreign_key(from_table, to_table = nil, **options)
|
63
|
-
return if options
|
63
|
+
return if options.delete(:if_exists) == true && !foreign_key_exists?(from_table, to_table)
|
64
64
|
|
65
65
|
to_table ||= options[:to_table]
|
66
66
|
options = options.except(:name, :to_table, :validate)
|
@@ -44,7 +44,7 @@ module ActiveRecord
|
|
44
44
|
#
|
45
45
|
# ActiveRecord::Base.establish_connection(:production)
|
46
46
|
#
|
47
|
-
# The exceptions AdapterNotSpecified, AdapterNotFound and +ArgumentError+
|
47
|
+
# The exceptions AdapterNotSpecified, AdapterNotFound, and +ArgumentError+
|
48
48
|
# may be returned on an error.
|
49
49
|
def establish_connection(config_or_env = nil)
|
50
50
|
config_or_env ||= DEFAULT_ENV.call.to_sym
|
@@ -108,7 +108,7 @@ module ActiveRecord
|
|
108
108
|
connections
|
109
109
|
end
|
110
110
|
|
111
|
-
# Connects to a role (
|
111
|
+
# Connects to a role (e.g. writing, reading, or a custom role) and/or
|
112
112
|
# shard for the duration of the block. At the end of the block the
|
113
113
|
# connection will be returned to the original role / shard.
|
114
114
|
#
|
data/lib/active_record/core.rb
CHANGED
@@ -60,7 +60,7 @@ module ActiveRecord
|
|
60
60
|
##
|
61
61
|
# :singleton-method:
|
62
62
|
# Force enumeration of all columns in SELECT statements.
|
63
|
-
# e.g.
|
63
|
+
# e.g. <tt>SELECT first_name, last_name FROM ...</tt> instead of <tt>SELECT * FROM ...</tt>
|
64
64
|
# This avoids +PreparedStatementCacheExpired+ errors when a column is added
|
65
65
|
# to the database while the app is running.
|
66
66
|
class_attribute :enumerate_columns_in_select_statements, instance_accessor: false, default: false
|
@@ -238,7 +238,7 @@ module ActiveRecord
|
|
238
238
|
def self.strict_loading_violation!(owner:, reflection:) # :nodoc:
|
239
239
|
case ActiveRecord.action_on_strict_loading_violation
|
240
240
|
when :raise
|
241
|
-
message =
|
241
|
+
message = reflection.strict_loading_violation_message(owner)
|
242
242
|
raise ActiveRecord::StrictLoadingViolationError.new(message)
|
243
243
|
when :log
|
244
244
|
name = "strict_loading_violation.active_record"
|
@@ -411,7 +411,7 @@ module ActiveRecord
|
|
411
411
|
end
|
412
412
|
end
|
413
413
|
|
414
|
-
#
|
414
|
+
# Override the default class equality method to provide support for decorated models.
|
415
415
|
def ===(object) # :nodoc:
|
416
416
|
object.is_a?(self)
|
417
417
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Encryption
|
5
|
-
# Configuration API for
|
5
|
+
# Configuration API for ActiveRecord::Encryption
|
6
6
|
module Configurable
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
@@ -52,9 +52,15 @@ module ActiveRecord
|
|
52
52
|
|
53
53
|
def install_auto_filtered_parameters_hook(application) # :nodoc:
|
54
54
|
ActiveRecord::Encryption.on_encrypted_attribute_declared do |klass, encrypted_attribute_name|
|
55
|
-
|
55
|
+
filter_parameter = [("#{klass.model_name.element}" if klass.name), encrypted_attribute_name.to_s].compact.join(".")
|
56
|
+
application.config.filter_parameters << filter_parameter unless excluded_from_filter_parameters?(filter_parameter)
|
56
57
|
end
|
57
58
|
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def excluded_from_filter_parameters?(filter_parameter)
|
62
|
+
ActiveRecord::Encryption.config.excluded_from_filter_parameters.find { |excluded_filter| excluded_filter.to_s == filter_parameter }
|
63
|
+
end
|
58
64
|
end
|
59
65
|
end
|
60
66
|
end
|
@@ -2,14 +2,14 @@
|
|
2
2
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Encryption
|
5
|
-
#
|
5
|
+
# ActiveRecord::Encryption uses encryption contexts to configure the different entities used to
|
6
6
|
# encrypt/decrypt at a given moment in time.
|
7
7
|
#
|
8
|
-
# By default, the library uses a default encryption context. This is the
|
8
|
+
# By default, the library uses a default encryption context. This is the Context that gets configured
|
9
9
|
# initially via +config.active_record.encryption+ options. Library users can define nested encryption contexts
|
10
10
|
# when running blocks of code.
|
11
11
|
#
|
12
|
-
# See
|
12
|
+
# See Context.
|
13
13
|
module Contexts
|
14
14
|
extend ActiveSupport::Concern
|
15
15
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module ActiveRecord
|
4
4
|
module Encryption
|
5
|
-
# A
|
5
|
+
# A KeyProvider that derives keys from passwords.
|
6
6
|
class DerivedSecretKeyProvider < KeyProvider
|
7
7
|
def initialize(passwords)
|
8
8
|
super(Array(passwords).collect { |password| Key.derive_from(password) })
|
@@ -18,12 +18,10 @@ module ActiveRecord
|
|
18
18
|
#
|
19
19
|
# === Options
|
20
20
|
#
|
21
|
-
# * <tt>:key_provider</tt> -
|
22
|
-
#
|
21
|
+
# * <tt>:key_provider</tt> - A key provider to provide encryption and decryption keys. Defaults to
|
22
|
+
# +ActiveRecord::Encryption.key_provider+.
|
23
23
|
# * <tt>:key</tt> - A password to derive the key from. It's a shorthand for a +:key_provider+ that
|
24
24
|
# serves derivated keys. Both options can't be used at the same time.
|
25
|
-
# * <tt>:key_provider</tt> - Set a +:key_provider+ to provide encryption and decryption keys. If not
|
26
|
-
# provided, it will default to the key provider set with `config.key_provider`.
|
27
25
|
# * <tt>:deterministic</tt> - By default, encryption is not deterministic. It will use a random
|
28
26
|
# initialization vector for each encryption operation. This means that encrypting the same content
|
29
27
|
# with the same key twice will generate different ciphertexts. When set to +true+, it will generate the
|