activerecord 6.0.3.6 → 6.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +771 -737
- data/MIT-LICENSE +1 -1
- data/README.rdoc +2 -2
- data/lib/active_record.rb +7 -14
- data/lib/active_record/aggregations.rb +1 -1
- data/lib/active_record/association_relation.rb +22 -14
- data/lib/active_record/associations.rb +114 -11
- data/lib/active_record/associations/alias_tracker.rb +19 -15
- data/lib/active_record/associations/association.rb +40 -29
- data/lib/active_record/associations/association_scope.rb +17 -15
- data/lib/active_record/associations/belongs_to_association.rb +15 -5
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
- data/lib/active_record/associations/builder/association.rb +9 -3
- data/lib/active_record/associations/builder/belongs_to.rb +10 -7
- data/lib/active_record/associations/builder/collection_association.rb +5 -4
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -1
- data/lib/active_record/associations/builder/has_many.rb +6 -2
- data/lib/active_record/associations/builder/has_one.rb +11 -14
- data/lib/active_record/associations/builder/singular_association.rb +1 -1
- data/lib/active_record/associations/collection_association.rb +19 -6
- data/lib/active_record/associations/collection_proxy.rb +13 -5
- data/lib/active_record/associations/foreign_association.rb +13 -0
- data/lib/active_record/associations/has_many_association.rb +24 -2
- data/lib/active_record/associations/has_many_through_association.rb +10 -4
- data/lib/active_record/associations/has_one_association.rb +15 -1
- data/lib/active_record/associations/join_dependency.rb +72 -50
- data/lib/active_record/associations/join_dependency/join_association.rb +36 -14
- data/lib/active_record/associations/join_dependency/join_part.rb +3 -3
- data/lib/active_record/associations/preloader.rb +11 -5
- data/lib/active_record/associations/preloader/association.rb +51 -25
- data/lib/active_record/associations/preloader/through_association.rb +2 -2
- data/lib/active_record/associations/singular_association.rb +1 -1
- data/lib/active_record/associations/through_association.rb +1 -1
- data/lib/active_record/attribute_assignment.rb +10 -8
- data/lib/active_record/attribute_methods.rb +52 -48
- data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
- data/lib/active_record/attribute_methods/dirty.rb +1 -11
- data/lib/active_record/attribute_methods/primary_key.rb +6 -2
- data/lib/active_record/attribute_methods/query.rb +3 -6
- data/lib/active_record/attribute_methods/read.rb +8 -11
- data/lib/active_record/attribute_methods/serialization.rb +4 -4
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -13
- data/lib/active_record/attribute_methods/write.rb +12 -20
- data/lib/active_record/attributes.rb +27 -7
- data/lib/active_record/autosave_association.rb +57 -40
- data/lib/active_record/base.rb +2 -14
- data/lib/active_record/callbacks.rb +32 -22
- data/lib/active_record/coders/yaml_column.rb +1 -1
- data/lib/active_record/connection_adapters.rb +50 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +186 -134
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +2 -44
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +65 -22
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -7
- data/lib/active_record/connection_adapters/abstract/quoting.rb +34 -34
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -116
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +112 -27
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +224 -85
- data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -24
- data/lib/active_record/connection_adapters/abstract_adapter.rb +36 -69
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +129 -88
- data/lib/active_record/connection_adapters/column.rb +15 -1
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/legacy_pool_manager.rb +31 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +23 -25
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +33 -6
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +8 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +11 -7
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +10 -1
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +31 -12
- data/lib/active_record/connection_adapters/pool_config.rb +63 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +43 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +24 -1
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +13 -54
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -5
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +24 -5
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +11 -1
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +61 -29
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +8 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +72 -55
- data/lib/active_record/connection_adapters/schema_cache.rb +98 -15
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +10 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +31 -6
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +1 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +37 -4
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +49 -50
- data/lib/active_record/connection_handling.rb +210 -71
- data/lib/active_record/core.rb +220 -55
- data/lib/active_record/database_configurations.rb +124 -85
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
- data/lib/active_record/database_configurations/database_config.rb +52 -9
- data/lib/active_record/database_configurations/hash_config.rb +54 -8
- data/lib/active_record/database_configurations/url_config.rb +15 -40
- data/lib/active_record/delegated_type.rb +209 -0
- data/lib/active_record/destroy_association_async_job.rb +36 -0
- data/lib/active_record/enum.rb +27 -10
- data/lib/active_record/errors.rb +47 -12
- data/lib/active_record/explain.rb +9 -4
- data/lib/active_record/explain_subscriber.rb +1 -1
- data/lib/active_record/fixture_set/file.rb +10 -17
- data/lib/active_record/fixture_set/model_metadata.rb +1 -2
- data/lib/active_record/fixture_set/render_context.rb +1 -1
- data/lib/active_record/fixture_set/table_row.rb +2 -2
- data/lib/active_record/fixtures.rb +54 -8
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +40 -18
- data/lib/active_record/insert_all.rb +33 -6
- data/lib/active_record/integration.rb +3 -5
- data/lib/active_record/internal_metadata.rb +15 -4
- data/lib/active_record/legacy_yaml_adapter.rb +7 -3
- data/lib/active_record/locking/optimistic.rb +22 -16
- data/lib/active_record/locking/pessimistic.rb +6 -2
- data/lib/active_record/log_subscriber.rb +26 -8
- data/lib/active_record/middleware/database_selector.rb +4 -1
- data/lib/active_record/middleware/database_selector/resolver.rb +5 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +3 -0
- data/lib/active_record/migration.rb +113 -83
- data/lib/active_record/migration/command_recorder.rb +47 -27
- data/lib/active_record/migration/compatibility.rb +67 -17
- data/lib/active_record/model_schema.rb +88 -13
- data/lib/active_record/nested_attributes.rb +2 -3
- data/lib/active_record/no_touching.rb +1 -1
- data/lib/active_record/persistence.rb +50 -45
- data/lib/active_record/query_cache.rb +15 -5
- data/lib/active_record/querying.rb +11 -6
- data/lib/active_record/railtie.rb +64 -44
- data/lib/active_record/railties/databases.rake +253 -98
- data/lib/active_record/readonly_attributes.rb +4 -0
- data/lib/active_record/reflection.rb +70 -57
- data/lib/active_record/relation.rb +96 -67
- data/lib/active_record/relation/batches.rb +38 -31
- data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
- data/lib/active_record/relation/calculations.rb +101 -44
- data/lib/active_record/relation/delegation.rb +2 -1
- data/lib/active_record/relation/finder_methods.rb +45 -15
- data/lib/active_record/relation/from_clause.rb +1 -1
- data/lib/active_record/relation/merger.rb +27 -25
- data/lib/active_record/relation/predicate_builder.rb +57 -33
- data/lib/active_record/relation/predicate_builder/array_handler.rb +8 -9
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +2 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +3 -3
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/query_methods.rb +330 -195
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +6 -5
- data/lib/active_record/relation/where_clause.rb +104 -57
- data/lib/active_record/result.rb +41 -33
- data/lib/active_record/runtime_registry.rb +2 -2
- data/lib/active_record/sanitization.rb +6 -17
- data/lib/active_record/schema_dumper.rb +34 -4
- data/lib/active_record/schema_migration.rb +0 -4
- data/lib/active_record/scoping/named.rb +6 -17
- data/lib/active_record/secure_token.rb +16 -8
- data/lib/active_record/serialization.rb +5 -3
- data/lib/active_record/signed_id.rb +116 -0
- data/lib/active_record/statement_cache.rb +20 -4
- data/lib/active_record/store.rb +2 -2
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +36 -52
- data/lib/active_record/tasks/database_tasks.rb +139 -113
- data/lib/active_record/tasks/mysql_database_tasks.rb +34 -35
- data/lib/active_record/tasks/postgresql_database_tasks.rb +24 -26
- data/lib/active_record/tasks/sqlite_database_tasks.rb +13 -9
- data/lib/active_record/test_databases.rb +5 -4
- data/lib/active_record/test_fixtures.rb +37 -16
- data/lib/active_record/timestamp.rb +4 -6
- data/lib/active_record/touch_later.rb +21 -21
- data/lib/active_record/transactions.rb +15 -64
- data/lib/active_record/type.rb +8 -1
- data/lib/active_record/type/serialized.rb +6 -2
- data/lib/active_record/type/time.rb +10 -0
- data/lib/active_record/type_caster/connection.rb +0 -1
- data/lib/active_record/type_caster/map.rb +8 -5
- data/lib/active_record/validations.rb +1 -0
- data/lib/active_record/validations/numericality.rb +35 -0
- data/lib/active_record/validations/uniqueness.rb +24 -4
- data/lib/arel.rb +5 -13
- data/lib/arel/attributes/attribute.rb +4 -0
- data/lib/arel/collectors/bind.rb +5 -0
- data/lib/arel/collectors/composite.rb +8 -0
- data/lib/arel/collectors/sql_string.rb +7 -0
- data/lib/arel/collectors/substitute_binds.rb +7 -0
- data/lib/arel/nodes.rb +3 -1
- data/lib/arel/nodes/binary.rb +82 -8
- data/lib/arel/nodes/bind_param.rb +8 -0
- data/lib/arel/nodes/casted.rb +21 -9
- data/lib/arel/nodes/equality.rb +6 -9
- data/lib/arel/nodes/grouping.rb +3 -0
- data/lib/arel/nodes/homogeneous_in.rb +72 -0
- data/lib/arel/nodes/in.rb +8 -1
- data/lib/arel/nodes/infix_operation.rb +13 -1
- data/lib/arel/nodes/join_source.rb +1 -1
- data/lib/arel/nodes/node.rb +7 -6
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/sql_literal.rb +3 -0
- data/lib/arel/nodes/table_alias.rb +7 -3
- data/lib/arel/nodes/unary.rb +0 -1
- data/lib/arel/predications.rb +12 -18
- data/lib/arel/select_manager.rb +1 -2
- data/lib/arel/table.rb +13 -5
- data/lib/arel/visitors.rb +0 -7
- data/lib/arel/visitors/dot.rb +14 -2
- data/lib/arel/visitors/mysql.rb +11 -1
- data/lib/arel/visitors/postgresql.rb +15 -4
- data/lib/arel/visitors/to_sql.rb +89 -78
- data/lib/rails/generators/active_record/migration.rb +6 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +1 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +2 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +3 -3
- data/lib/rails/generators/active_record/model/model_generator.rb +39 -2
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- metadata +27 -28
- data/lib/active_record/advisory_lock_base.rb +0 -18
- data/lib/active_record/attribute_decorators.rb +0 -88
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -296
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -29
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/railties/collection_cache_association_loading.rb +0 -34
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -18
- data/lib/active_record/relation/where_clause_factory.rb +0 -33
- data/lib/arel/attributes.rb +0 -22
- data/lib/arel/visitors/depth_first.rb +0 -203
- data/lib/arel/visitors/ibm_db.rb +0 -34
- data/lib/arel/visitors/informix.rb +0 -62
- data/lib/arel/visitors/mssql.rb +0 -156
- data/lib/arel/visitors/oracle.rb +0 -158
- data/lib/arel/visitors/oracle12.rb +0 -65
- data/lib/arel/visitors/where_sql.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66ac86600eb6f03cff86765392e7ec1baf5741aca1050133653dab7d9552ede3
|
4
|
+
data.tar.gz: ab475bbab2246deea73d3d699374c6f309fdddc97f467d783695af1e737cb352
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51480027525839e315d70abb310a433cfa48c9fb25084ba13ce4d18d205e0d3eb4ae79fe259716a15c055e7083d381e590ddc4e6829662c21276cacf70845834
|
7
|
+
data.tar.gz: ec51c2bc1172ec830f700aea91674fed170a9d362c7a8be600328055db0132d79b38049d8ee9ad03729b962c7667982519b3fb0bfa8569cac7c3686c8f73ebd3
|
data/CHANGELOG.md
CHANGED
@@ -1,1237 +1,1271 @@
|
|
1
|
-
## Rails 6.0.
|
1
|
+
## Rails 6.1.0.rc1 (November 02, 2020) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Add `connected_to_many` API.
|
4
4
|
|
5
|
+
This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
|
5
6
|
|
6
|
-
|
7
|
+
Before:
|
7
8
|
|
8
|
-
|
9
|
+
AnimalsRecord.connected_to(role: :reading) do
|
10
|
+
MealsRecord.connected_to(role: :reading) do
|
11
|
+
Dog.first # read from animals replica
|
12
|
+
Dinner.first # read from meals replica
|
13
|
+
Person.first # read from primary writer
|
14
|
+
end
|
15
|
+
end
|
9
16
|
|
10
|
-
|
11
|
-
for validating the money format in the PostgreSQL adapter. This patch
|
12
|
-
fixes the regexp.
|
17
|
+
After:
|
13
18
|
|
14
|
-
|
19
|
+
ActiveRecord::Base.connected_to_many([AnimalsRecord, MealsRecord], role: :reading) do
|
20
|
+
Dog.first # read from animals replica
|
21
|
+
Dinner.first # read from meals replica
|
22
|
+
Person.first # read from primary writer
|
23
|
+
end
|
15
24
|
|
16
|
-
|
25
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
17
26
|
|
18
|
-
|
27
|
+
* Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
|
19
28
|
|
29
|
+
Some applications may not want to raise an error in production if using `strict_loading`. This would allow an application to set strict loading to log for the production environment while still raising in development and test environments.
|
20
30
|
|
21
|
-
|
31
|
+
Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
|
22
32
|
|
23
|
-
*
|
33
|
+
*Eileen M. Uchitelle*
|
24
34
|
|
35
|
+
* Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
|
25
36
|
|
26
|
-
|
37
|
+
Fixes #34255.
|
27
38
|
|
28
|
-
*
|
39
|
+
*Steven Weber*
|
29
40
|
|
41
|
+
* Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
|
30
42
|
|
31
|
-
|
43
|
+
Because the default behaviour when adding an index with multiple columns is to use all column names in the index name, this could frequently lead to overly long index names for polymorphic references which would fail the migration if it exceeded the database limit.
|
32
44
|
|
33
|
-
|
45
|
+
This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
|
34
46
|
|
47
|
+
Fixes #38655.
|
35
48
|
|
36
|
-
|
49
|
+
*Luke Redpath*
|
37
50
|
|
38
|
-
*
|
51
|
+
* MySQL: Uniqueness validator now respects default database collation,
|
52
|
+
no longer enforce case sensitive comparison by default.
|
39
53
|
|
54
|
+
*Ryuta Kamizono*
|
40
55
|
|
41
|
-
|
56
|
+
* Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
|
42
57
|
|
43
|
-
|
58
|
+
`column_name_length`
|
59
|
+
`table_name_length`
|
60
|
+
`columns_per_table`
|
61
|
+
`indexes_per_table`
|
62
|
+
`columns_per_multicolumn_index`
|
63
|
+
`sql_query_length`
|
64
|
+
`joins_per_query`
|
44
65
|
|
45
|
-
|
66
|
+
*Rafael Mendonça França*
|
46
67
|
|
47
|
-
|
68
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
|
48
69
|
|
49
|
-
*
|
70
|
+
*Rafael Mendonça França*
|
50
71
|
|
51
|
-
|
72
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
|
52
73
|
|
53
|
-
*
|
74
|
+
*Rafael Mendonça França*
|
54
75
|
|
55
|
-
|
76
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
|
56
77
|
|
57
|
-
*
|
78
|
+
*Rafael Mendonça França*
|
58
79
|
|
59
|
-
|
80
|
+
* Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
|
60
81
|
|
61
|
-
*
|
82
|
+
*Rafael Mendonça França*
|
62
83
|
|
63
|
-
*
|
84
|
+
* Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
|
64
85
|
|
65
|
-
|
86
|
+
*Rafael Mendonça França*
|
66
87
|
|
67
|
-
|
88
|
+
* Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
|
68
89
|
|
69
|
-
*
|
90
|
+
*Rafael Mendonça França*
|
70
91
|
|
71
|
-
|
92
|
+
* `relation.create` does no longer leak scope to class level querying methods
|
93
|
+
in initialization block and callbacks.
|
72
94
|
|
73
|
-
|
95
|
+
Before:
|
74
96
|
|
75
|
-
|
97
|
+
User.where(name: "John").create do |john|
|
98
|
+
User.find_by(name: "David") # => nil
|
99
|
+
end
|
76
100
|
|
77
|
-
|
101
|
+
After:
|
78
102
|
|
79
|
-
|
103
|
+
User.where(name: "John").create do |john|
|
104
|
+
User.find_by(name: "David") # => #<User name: "David", ...>
|
105
|
+
end
|
80
106
|
|
81
|
-
*
|
107
|
+
*Ryuta Kamizono*
|
82
108
|
|
83
|
-
*
|
84
|
-
ActiveRecord::Relation#cache_key_with_version. This method will be used by
|
85
|
-
ActionController::ConditionalGet to ensure that when collection cache versioning
|
86
|
-
is enabled, requests using ConditionalGet don't return the same ETag header
|
87
|
-
after a collection is modified. Fixes #38078.
|
109
|
+
* Named scope chain does no longer leak scope to class level querying methods.
|
88
110
|
|
89
|
-
|
111
|
+
class class User < ActiveRecord::Base
|
112
|
+
scope :david, -> { User.where(name: "David") }
|
113
|
+
end
|
90
114
|
|
91
|
-
|
115
|
+
Before:
|
92
116
|
|
93
|
-
|
117
|
+
User.where(name: "John").david
|
118
|
+
# SELECT * FROM users WHERE name = 'John' AND name = 'David'
|
94
119
|
|
95
|
-
|
120
|
+
After:
|
96
121
|
|
97
|
-
|
122
|
+
User.where(name: "John").david
|
123
|
+
# SELECT * FROM users WHERE name = 'David'
|
98
124
|
|
99
|
-
*
|
125
|
+
*Ryuta Kamizono*
|
100
126
|
|
127
|
+
* Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
|
101
128
|
|
102
|
-
|
129
|
+
`fetch`
|
130
|
+
`each`
|
131
|
+
`first`
|
132
|
+
`values`
|
133
|
+
`[]=`
|
103
134
|
|
104
|
-
*
|
135
|
+
*Rafael Mendonça França*
|
105
136
|
|
137
|
+
* `where.not` now generates NAND predicates instead of NOR.
|
106
138
|
|
107
|
-
|
139
|
+
Before:
|
108
140
|
|
109
|
-
|
141
|
+
User.where.not(name: "Jon", role: "admin")
|
142
|
+
# SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
|
110
143
|
|
144
|
+
After:
|
111
145
|
|
112
|
-
|
146
|
+
User.where.not(name: "Jon", role: "admin")
|
147
|
+
# SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
|
113
148
|
|
114
|
-
*
|
115
|
-
transactional tests for the same database.
|
149
|
+
*Rafael Mendonça França*
|
116
150
|
|
117
|
-
|
151
|
+
* Remove deprecated `ActiveRecord::Result#to_hash` method.
|
118
152
|
|
119
|
-
*
|
120
|
-
but not the entire collection.
|
153
|
+
*Rafael Mendonça França*
|
121
154
|
|
122
|
-
|
155
|
+
* Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
|
123
156
|
|
124
|
-
*
|
157
|
+
*Rafael Mendonça França*
|
125
158
|
|
126
|
-
|
159
|
+
* Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
|
127
160
|
|
128
|
-
*
|
161
|
+
*Rafael Mendonça França*
|
129
162
|
|
130
|
-
|
131
|
-
|
132
|
-
wouldn't be properly deprecated and `where.not` would work as
|
133
|
-
NAND instead.
|
163
|
+
* Allow users to silence the "Rails couldn't infer whether you are using multiple databases..."
|
164
|
+
message using `config.active_record.suppress_multiple_database_warning`.
|
134
165
|
|
135
|
-
*
|
166
|
+
*Omri Gabay*
|
136
167
|
|
137
|
-
*
|
138
|
-
to the previous database.
|
168
|
+
* Connections can be granularly switched for abstract classes when `connected_to` is called.
|
139
169
|
|
140
|
-
|
141
|
-
resulting in the last one to be used by subsequent rake tasks.
|
142
|
-
We should reestablish a connection to the connection that was
|
143
|
-
established before the migrate tasks was run
|
170
|
+
This change allows `connected_to` to switch a `role` and/or `shard` for a single abstract class instead of all classes globally. Applications that want to use the new feature need to set `config.active_record.legacy_connection_handling` to `false` in their application configuration.
|
144
171
|
|
145
|
-
|
172
|
+
Example usage:
|
146
173
|
|
147
|
-
|
174
|
+
Given an application we have a `User` model that inherits from `ApplicationRecord` and a `Dog` model that inherits from `AnimalsRecord`. `AnimalsRecord` and `ApplicationRecord` have writing and reading connections as well as shard `default`, `one`, and `two`.
|
148
175
|
|
149
|
-
|
176
|
+
```ruby
|
177
|
+
ActiveRecord::Base.connected_to(role: :reading) do
|
178
|
+
User.first # reads from default replica
|
179
|
+
Dog.first # reads from default replica
|
150
180
|
|
181
|
+
AnimalsRecord.connected_to(role: :writing, shard: :one) do
|
182
|
+
User.first # reads from default replica
|
183
|
+
Dog.first # reads from shard one primary
|
184
|
+
end
|
151
185
|
|
152
|
-
|
186
|
+
User.first # reads from default replica
|
187
|
+
Dog.first # reads from default replica
|
153
188
|
|
154
|
-
|
189
|
+
ApplicationRecord.connected_to(role: :writing, shard: :two) do
|
190
|
+
User.first # reads from shard two primary
|
191
|
+
Dog.first # reads from default replica
|
192
|
+
end
|
193
|
+
end
|
194
|
+
```
|
155
195
|
|
156
|
-
|
196
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
157
197
|
|
158
|
-
*
|
198
|
+
* Allow double-dash comment syntax when querying read-only databases
|
159
199
|
|
160
|
-
|
200
|
+
*James Adam*
|
161
201
|
|
162
|
-
*
|
202
|
+
* Add `values_at` method.
|
163
203
|
|
164
|
-
|
204
|
+
Returns an array containing the values associated with the given methods.
|
165
205
|
|
166
|
-
|
167
|
-
|
206
|
+
```ruby
|
207
|
+
topic = Topic.first
|
208
|
+
topic.values_at(:title, :author_name)
|
209
|
+
# => ["Budget", "Jason"]
|
210
|
+
```
|
168
211
|
|
169
|
-
|
212
|
+
Similar to `Hash#values_at` but on an Active Record instance.
|
170
213
|
|
171
|
-
*
|
172
|
-
their payloads.
|
214
|
+
*Guillaume Briday*
|
173
215
|
|
174
|
-
|
216
|
+
* Fix `read_attribute_before_type_cast` to consider attribute aliases.
|
175
217
|
|
176
|
-
*
|
177
|
-
previously-committed record state.
|
218
|
+
*Marcelo Lauxen*
|
178
219
|
|
179
|
-
|
220
|
+
* Support passing record to uniqueness validator `:conditions` callable:
|
180
221
|
|
181
|
-
|
222
|
+
```ruby
|
223
|
+
class Article < ApplicationRecord
|
224
|
+
validates_uniqueness_of :title, conditions: ->(article) {
|
225
|
+
published_at = article.published_at
|
226
|
+
where(published_at: published_at.beginning_of_year..published_at.end_of_year)
|
227
|
+
}
|
228
|
+
end
|
229
|
+
```
|
182
230
|
|
183
|
-
|
231
|
+
*Eliot Sykes*
|
184
232
|
|
185
|
-
* `
|
233
|
+
* `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
|
234
|
+
total number of rows affected, just like their non-batched counterparts.
|
186
235
|
|
187
|
-
|
236
|
+
```ruby
|
237
|
+
Person.in_batches.update_all("first_name = 'Eugene'") # => 42
|
238
|
+
Person.in_batches.delete_all # => 42
|
239
|
+
```
|
188
240
|
|
189
|
-
|
241
|
+
Fixes #40287.
|
190
242
|
|
191
243
|
*Eugene Kenny*
|
192
244
|
|
193
|
-
*
|
194
|
-
|
245
|
+
* Add support for PostgreSQL `interval` data type with conversion to
|
246
|
+
`ActiveSupport::Duration` when loading records from database and
|
247
|
+
serialization to ISO 8601 formatted duration string on save.
|
248
|
+
Add support to define a column in migrations and get it in a schema dump.
|
249
|
+
Optional column precision is supported.
|
195
250
|
|
196
|
-
|
197
|
-
|
198
|
-
* The memoized result of `ActiveRecord::Relation#take` is properly cleared
|
199
|
-
when `ActiveRecord::Relation#reset` or `ActiveRecord::Relation#reload`
|
200
|
-
is called.
|
251
|
+
To use this in 6.1, you need to place the next string to your model file:
|
201
252
|
|
202
|
-
|
253
|
+
attribute :duration, :interval
|
203
254
|
|
204
|
-
|
255
|
+
To keep old behavior until 6.2 is released:
|
205
256
|
|
206
|
-
|
257
|
+
attribute :duration, :string
|
207
258
|
|
208
|
-
|
259
|
+
Example:
|
209
260
|
|
210
|
-
|
261
|
+
create_table :events do |t|
|
262
|
+
t.string :name
|
263
|
+
t.interval :duration
|
264
|
+
end
|
211
265
|
|
212
|
-
|
266
|
+
class Event < ApplicationRecord
|
267
|
+
attribute :duration, :interval
|
268
|
+
end
|
213
269
|
|
214
|
-
|
270
|
+
Event.create!(name: 'Rock Fest', duration: 2.days)
|
271
|
+
Event.last.duration # => 2 days
|
272
|
+
Event.last.duration.iso8601 # => "P2D"
|
273
|
+
Event.new(duration: 'P1DT12H3S').duration # => 1 day, 12 hours, and 3 seconds
|
274
|
+
Event.new(duration: '1 day') # Unknown value will be ignored and NULL will be written to database
|
215
275
|
|
216
|
-
|
276
|
+
*Andrey Novikov*
|
217
277
|
|
218
|
-
|
278
|
+
* Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
|
219
279
|
|
220
|
-
|
280
|
+
```ruby
|
281
|
+
class Account < ActiveRecord::Base
|
282
|
+
belongs_to :supplier, dependent: :destroy_async
|
283
|
+
end
|
284
|
+
```
|
221
285
|
|
222
|
-
|
286
|
+
`:destroy_async` will enqueue a job to destroy associated records in the background.
|
223
287
|
|
288
|
+
*DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
|
224
289
|
|
225
|
-
|
290
|
+
* Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
|
226
291
|
|
227
|
-
*
|
292
|
+
*Jason Schweier*
|
228
293
|
|
229
|
-
|
294
|
+
* `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
|
230
295
|
|
231
|
-
|
296
|
+
Ensure that `connects_to` can only be called from `ActiveRecord::Base` or abstract classes. This protects the application from opening duplicate or too many connections.
|
232
297
|
|
233
|
-
*
|
298
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
234
299
|
|
235
|
-
|
300
|
+
* All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
|
301
|
+
`ActiveRecord::StatementInvalid` when they encounter a connection error.
|
236
302
|
|
237
|
-
*
|
303
|
+
*Jean Boussier*
|
238
304
|
|
239
|
-
|
240
|
-
|
241
|
-
end
|
305
|
+
* `Mysql2Adapter#quote_string` now raises `ActiveRecord::ConnectionNotEstablished` rather than
|
306
|
+
`ActiveRecord::StatementInvalid` when it can't connect to the MySQL server.
|
242
307
|
|
243
|
-
*
|
308
|
+
*Jean Boussier*
|
244
309
|
|
245
|
-
*
|
310
|
+
* Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
|
246
311
|
|
247
|
-
*
|
312
|
+
*Alex Robbin*
|
248
313
|
|
314
|
+
* Ensure the default configuration is considered primary or first for an environment
|
249
315
|
|
250
|
-
|
316
|
+
If a multiple database application provides a configuration named primary, that will be treated as default. In applications that do not have a primary entry, the default database configuration will be the first configuration for an environment.
|
251
317
|
|
252
|
-
*
|
318
|
+
*Eileen M. Uchitelle*
|
253
319
|
|
254
|
-
|
320
|
+
* Allow `where` references association names as joined table name aliases.
|
255
321
|
|
256
|
-
|
322
|
+
```ruby
|
323
|
+
class Comment < ActiveRecord::Base
|
324
|
+
enum label: [:default, :child]
|
325
|
+
has_many :children, class_name: "Comment", foreign_key: :parent_id
|
326
|
+
end
|
257
327
|
|
258
|
-
|
328
|
+
# ... FROM comments LEFT OUTER JOIN comments children ON ... WHERE children.label = 1
|
329
|
+
Comment.includes(:children).where("children.label": "child")
|
330
|
+
```
|
259
331
|
|
260
332
|
*Ryuta Kamizono*
|
261
333
|
|
262
|
-
*
|
334
|
+
* Support storing demodulized class name for polymorphic type.
|
263
335
|
|
264
|
-
|
336
|
+
Before Rails 6.1, storing demodulized class name is supported only for STI type
|
337
|
+
by `store_full_sti_class` class attribute.
|
265
338
|
|
266
|
-
|
339
|
+
Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
|
267
340
|
|
268
|
-
*
|
341
|
+
*Ryuta Kamizono*
|
269
342
|
|
270
|
-
|
343
|
+
* Deprecate `rails db:structure:{load, dump}` tasks and extend
|
344
|
+
`rails db:schema:{load, dump}` tasks to work with either `:ruby` or `:sql` format,
|
345
|
+
depending on `config.active_record.schema_format` configuration value.
|
271
346
|
|
272
|
-
*
|
347
|
+
*fatkodima*
|
273
348
|
|
274
|
-
|
349
|
+
* Respect the `select` values for eager loading.
|
275
350
|
|
276
|
-
|
351
|
+
```ruby
|
352
|
+
post = Post.select("UPPER(title) AS title").first
|
353
|
+
post.title # => "WELCOME TO THE WEBLOG"
|
354
|
+
post.body # => ActiveModel::MissingAttributeError
|
355
|
+
|
356
|
+
# Rails 6.0 (ignore the `select` values)
|
357
|
+
post = Post.select("UPPER(title) AS title").eager_load(:comments).first
|
358
|
+
post.title # => "Welcome to the weblog"
|
359
|
+
post.body # => "Such a lovely day"
|
360
|
+
|
361
|
+
# Rails 6.1 (respect the `select` values)
|
362
|
+
post = Post.select("UPPER(title) AS title").eager_load(:comments).first
|
363
|
+
post.title # => "WELCOME TO THE WEBLOG"
|
364
|
+
post.body # => ActiveModel::MissingAttributeError
|
365
|
+
```
|
277
366
|
|
278
|
-
*
|
367
|
+
*Ryuta Kamizono*
|
279
368
|
|
280
|
-
|
369
|
+
* Allow attribute's default to be configured but keeping its own type.
|
370
|
+
|
371
|
+
```ruby
|
372
|
+
class Post < ActiveRecord::Base
|
373
|
+
attribute :written_at, default: -> { Time.now.utc }
|
374
|
+
end
|
281
375
|
|
282
|
-
|
376
|
+
# Rails 6.0
|
377
|
+
Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
|
283
378
|
|
284
|
-
|
379
|
+
# Rails 6.1
|
380
|
+
Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
|
381
|
+
```
|
285
382
|
|
286
383
|
*Ryuta Kamizono*
|
287
384
|
|
385
|
+
* Allow default to be configured for Enum.
|
288
386
|
|
289
|
-
|
387
|
+
```ruby
|
388
|
+
class Book < ActiveRecord::Base
|
389
|
+
enum status: [:proposed, :written, :published], _default: :published
|
390
|
+
end
|
290
391
|
|
291
|
-
|
392
|
+
Book.new.status # => "published"
|
393
|
+
```
|
292
394
|
|
293
|
-
*
|
395
|
+
*Ryuta Kamizono*
|
294
396
|
|
295
|
-
* Deprecate
|
397
|
+
* Deprecate YAML loading from legacy format older than Rails 5.0.
|
296
398
|
|
297
|
-
|
298
|
-
all = [treasures(:diamond), treasures(:sapphire), cars(:honda), treasures(:sapphire)]
|
299
|
-
assert_equal all, PriceEstimate.all.map(&:estimate_of)
|
300
|
-
```
|
399
|
+
*Ryuta Kamizono*
|
301
400
|
|
302
|
-
|
401
|
+
* Added the setting `ActiveRecord::Base.immutable_strings_by_default`, which
|
402
|
+
allows you to specify that all string columns should be frozen unless
|
403
|
+
otherwise specified. This will reduce memory pressure for applications which
|
404
|
+
do not generally mutate string properties of Active Record objects.
|
303
405
|
|
304
|
-
|
305
|
-
sapphire = treasures(:sapphire)
|
306
|
-
|
307
|
-
nor = all.reject { |e|
|
308
|
-
e.estimate_of_type == sapphire.class.polymorphic_name
|
309
|
-
}.reject { |e|
|
310
|
-
e.estimate_of_id == sapphire.id
|
311
|
-
}
|
312
|
-
assert_equal [cars(:honda)], nor
|
313
|
-
|
314
|
-
without_sapphire = PriceEstimate.where.not(
|
315
|
-
estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
|
316
|
-
)
|
317
|
-
assert_equal nor, without_sapphire.map(&:estimate_of)
|
318
|
-
```
|
406
|
+
*Sean Griffin*, *Ryuta Kamizono*
|
319
407
|
|
320
|
-
|
408
|
+
* Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
|
409
|
+
|
410
|
+
*Ryuta Kamizono*
|
411
|
+
|
412
|
+
* Support `relation.and` for intersection as Set theory.
|
321
413
|
|
322
414
|
```ruby
|
323
|
-
|
415
|
+
david_and_mary = Author.where(id: [david, mary])
|
416
|
+
mary_and_bob = Author.where(id: [mary, bob])
|
324
417
|
|
325
|
-
|
326
|
-
assert_equal [treasures(:diamond), cars(:honda)], nand
|
418
|
+
david_and_mary.merge(mary_and_bob) # => [mary, bob]
|
327
419
|
|
328
|
-
|
329
|
-
|
330
|
-
)
|
331
|
-
assert_equal nand, without_sapphire.map(&:estimate_of)
|
420
|
+
david_and_mary.and(mary_and_bob) # => [mary]
|
421
|
+
david_and_mary.or(mary_and_bob) # => [david, mary, bob]
|
332
422
|
```
|
333
423
|
|
334
424
|
*Ryuta Kamizono*
|
335
425
|
|
336
|
-
*
|
426
|
+
* Merging conditions on the same column no longer maintain both conditions,
|
427
|
+
and will be consistently replaced by the latter condition in Rails 6.2.
|
428
|
+
To migrate to Rails 6.2's behavior, use `relation.merge(other, rewhere: true)`.
|
429
|
+
|
430
|
+
```ruby
|
431
|
+
# Rails 6.1 (IN clause is replaced by merger side equality condition)
|
432
|
+
Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
|
337
433
|
|
338
|
-
|
434
|
+
# Rails 6.1 (both conflict conditions exists, deprecated)
|
435
|
+
Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
|
339
436
|
|
340
|
-
|
437
|
+
# Rails 6.1 with rewhere to migrate to Rails 6.2's behavior
|
438
|
+
Author.where(id: david.id..mary.id).merge(Author.where(id: bob), rewhere: true) # => [bob]
|
341
439
|
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
440
|
+
# Rails 6.2 (same behavior with IN clause, mergee side condition is consistently replaced)
|
441
|
+
Author.where(id: [david.id, mary.id]).merge(Author.where(id: bob)) # => [bob]
|
442
|
+
Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => [bob]
|
443
|
+
```
|
346
444
|
|
347
|
-
|
348
|
-
cache keys with timestamps until you set `ActiveRecord::Base.collection_cache_versioning = true`.
|
349
|
-
That's the setting for all new apps on Rails 6.0+
|
445
|
+
*Ryuta Kamizono*
|
350
446
|
|
351
|
-
|
447
|
+
* Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
|
352
448
|
|
353
|
-
*
|
449
|
+
*Peter Fry*
|
354
450
|
|
355
|
-
|
451
|
+
* Resolve issue with insert_all unique_by option when used with expression index.
|
356
452
|
|
357
|
-
|
453
|
+
When the `:unique_by` option of `ActiveRecord::Persistence.insert_all` and
|
454
|
+
`ActiveRecord::Persistence.upsert_all` was used with the name of an expression index, an error
|
455
|
+
was raised. Adding a guard around the formatting behavior for the `:unique_by` corrects this.
|
358
456
|
|
359
|
-
|
360
|
-
`to` and `from` options are specified.
|
457
|
+
Usage:
|
361
458
|
|
362
|
-
|
459
|
+
```ruby
|
460
|
+
create_table :books, id: :integer, force: true do |t|
|
461
|
+
t.column :name, :string
|
462
|
+
t.index "lower(name)", unique: true
|
463
|
+
end
|
363
464
|
|
364
|
-
|
465
|
+
Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
|
466
|
+
```
|
365
467
|
|
366
|
-
Fixes #
|
468
|
+
Fixes #39516.
|
367
469
|
|
368
|
-
*
|
470
|
+
*Austen Madden*
|
369
471
|
|
370
|
-
*
|
472
|
+
* Add basic support for CHECK constraints to database migrations.
|
371
473
|
|
372
|
-
|
373
|
-
associations, the callback for a `has_many` association was run while
|
374
|
-
another instance of the same callback on the same association hadn't
|
375
|
-
finished running. When control returned to the first instance of the
|
376
|
-
callback, the instance variable had changed, and subsequent associated
|
377
|
-
records weren't saved correctly. Specifically, the ID field for the
|
378
|
-
`belongs_to` corresponding to the `has_many` was `nil`.
|
474
|
+
Usage:
|
379
475
|
|
380
|
-
|
476
|
+
```ruby
|
477
|
+
add_check_constraint :products, "price > 0", name: "price_check"
|
478
|
+
remove_check_constraint :products, name: "price_check"
|
479
|
+
```
|
381
480
|
|
382
|
-
*
|
481
|
+
*fatkodima*
|
383
482
|
|
384
|
-
*
|
483
|
+
* Add `ActiveRecord::Base.strict_loading_by_default` and `ActiveRecord::Base.strict_loading_by_default=`
|
484
|
+
to enable/disable strict_loading mode by default for a model. The configuration's value is
|
485
|
+
inheritable by subclasses, but they can override that value and it will not impact parent class.
|
385
486
|
|
386
|
-
|
487
|
+
Usage:
|
387
488
|
|
388
489
|
```ruby
|
389
|
-
|
390
|
-
|
391
|
-
add_column :items, :attr3, :integer, limit: 10 # => ActiveRecordError
|
392
|
-
add_column :items, :attr4, :datetime, precision: 10 # => ActiveRecordError
|
393
|
-
```
|
490
|
+
class Developer < ApplicationRecord
|
491
|
+
self.strict_loading_by_default = true
|
394
492
|
|
395
|
-
|
493
|
+
has_many :projects
|
494
|
+
end
|
396
495
|
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
add_column :items, :attr3, :integer, limit: 10 # => ArgumentError
|
401
|
-
add_column :items, :attr4, :datetime, precision: 10 # => ArgumentError
|
496
|
+
dev = Developer.first
|
497
|
+
dev.projects.first
|
498
|
+
# => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
|
402
499
|
```
|
403
500
|
|
501
|
+
*bogdanvlviv*
|
502
|
+
|
503
|
+
* Deprecate passing an Active Record object to `quote`/`type_cast` directly.
|
504
|
+
|
404
505
|
*Ryuta Kamizono*
|
405
506
|
|
406
|
-
*
|
407
|
-
whether preloaded / eager loaded or not, with the exception of `unscoped`.
|
507
|
+
* Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
|
408
508
|
|
409
509
|
Before:
|
410
510
|
|
411
511
|
```ruby
|
412
|
-
|
413
|
-
Comment.find(1).post # => nil
|
414
|
-
Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
|
415
|
-
Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
|
512
|
+
create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
|
416
513
|
end
|
417
514
|
```
|
418
515
|
|
419
516
|
After:
|
420
517
|
|
421
518
|
```ruby
|
422
|
-
|
423
|
-
Comment.find(1).post # => #<Post id: 1, ...>
|
424
|
-
Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
|
425
|
-
Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
|
519
|
+
create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
426
520
|
end
|
427
521
|
```
|
428
522
|
|
429
|
-
Fixes #34638, #35398.
|
430
|
-
|
431
523
|
*Ryuta Kamizono*
|
432
524
|
|
433
|
-
*
|
434
|
-
|
435
|
-
Runs `db:migrate` if the database exists or `db:setup` if it doesn't.
|
436
|
-
|
437
|
-
*Roberto Miranda*
|
438
|
-
|
439
|
-
* Add `after_save_commit` callback as shortcut for `after_commit :hook, on: [ :create, :update ]`.
|
525
|
+
* Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
|
526
|
+
See ActiveRecord::DelegatedType for the full description.
|
440
527
|
|
441
528
|
*DHH*
|
442
529
|
|
443
|
-
*
|
444
|
-
`before_add` and `after_add` callbacks for `has_many :through` associations.
|
445
|
-
|
446
|
-
Fixes #33249.
|
447
|
-
|
448
|
-
*Ryan H. Kerr*
|
530
|
+
* Deprecate aggregations with group by duplicated fields.
|
449
531
|
|
450
|
-
|
532
|
+
To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
|
451
533
|
|
452
|
-
```
|
453
|
-
|
454
|
-
|
534
|
+
```ruby
|
535
|
+
accounts = Account.group(:firm_id)
|
536
|
+
|
537
|
+
# duplicated group fields, deprecated.
|
538
|
+
accounts.merge(accounts.where.not(credit_limit: nil)).sum(:credit_limit)
|
539
|
+
# => {
|
540
|
+
# [1, 1] => 50,
|
541
|
+
# [2, 2] => 60
|
542
|
+
# }
|
543
|
+
|
544
|
+
# use `uniq!(:group)` to deduplicate group fields.
|
545
|
+
accounts.merge(accounts.where.not(credit_limit: nil)).uniq!(:group).sum(:credit_limit)
|
546
|
+
# => {
|
547
|
+
# 1 => 50,
|
548
|
+
# 2 => 60
|
549
|
+
# }
|
455
550
|
```
|
456
551
|
|
457
|
-
*
|
458
|
-
|
459
|
-
* Add `ActiveRecord::Relation#annotate` for adding SQL comments to its queries.
|
460
|
-
|
461
|
-
For example:
|
462
|
-
|
463
|
-
```
|
464
|
-
Post.where(id: 123).annotate("this is a comment").to_sql
|
465
|
-
# SELECT "posts".* FROM "posts" WHERE "posts"."id" = 123 /* this is a comment */
|
466
|
-
```
|
552
|
+
*Ryuta Kamizono*
|
467
553
|
|
468
|
-
|
554
|
+
* Deprecate duplicated query annotations.
|
469
555
|
|
470
|
-
|
556
|
+
To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
|
471
557
|
|
472
|
-
|
558
|
+
```ruby
|
559
|
+
accounts = Account.where(id: [1, 2]).annotate("david and mary")
|
473
560
|
|
474
|
-
|
475
|
-
|
561
|
+
# duplicated annotations, deprecated.
|
562
|
+
accounts.merge(accounts.rewhere(id: 3))
|
563
|
+
# SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */ /* david and mary */
|
476
564
|
|
477
|
-
|
565
|
+
# use `uniq!(:annotate)` to deduplicate annotations.
|
566
|
+
accounts.merge(accounts.rewhere(id: 3)).uniq!(:annotate)
|
567
|
+
# SELECT accounts.* FROM accounts WHERE accounts.id = 3 /* david and mary */
|
568
|
+
```
|
478
569
|
|
479
|
-
|
480
|
-
# SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
|
570
|
+
*Ryuta Kamizono*
|
481
571
|
|
482
|
-
|
572
|
+
* Resolve conflict between counter cache and optimistic locking.
|
483
573
|
|
484
|
-
|
485
|
-
|
574
|
+
Bump an Active Record instance's lock version after updating its counter
|
575
|
+
cache. This avoids raising an unnecessary `ActiveRecord::StaleObjectError`
|
576
|
+
upon subsequent transactions by maintaining parity with the corresponding
|
577
|
+
database record's `lock_version` column.
|
486
578
|
|
487
|
-
|
579
|
+
Fixes #16449.
|
488
580
|
|
489
|
-
*
|
490
|
-
* https://pghintplan.osdn.jp/pg_hint_plan.html
|
491
|
-
* https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/influencing-the-optimizer.html
|
492
|
-
* https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-query?view=sql-server-2017
|
493
|
-
* https://www.ibm.com/support/knowledgecenter/en/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0070117.html
|
581
|
+
*Aaron Lipman*
|
494
582
|
|
495
|
-
|
583
|
+
* Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
|
496
584
|
|
497
|
-
|
585
|
+
```ruby
|
586
|
+
david_and_mary = Author.where(id: david.id..mary.id)
|
498
587
|
|
499
|
-
|
588
|
+
# both conflict conditions exists
|
589
|
+
david_and_mary.merge(Author.where(id: bob)) # => []
|
500
590
|
|
501
|
-
|
502
|
-
|
503
|
-
attribute :user_defined_text, :text
|
504
|
-
end
|
591
|
+
# mergee side condition is replaced by rewhere
|
592
|
+
david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
|
505
593
|
|
506
|
-
|
594
|
+
# mergee side condition is replaced by rewhere option
|
595
|
+
david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
|
507
596
|
```
|
508
597
|
|
509
|
-
*
|
598
|
+
*Ryuta Kamizono*
|
510
599
|
|
511
|
-
*
|
600
|
+
* Add support for finding records based on signed ids, which are tamper-proof, verified ids that can be
|
601
|
+
set to expire and scoped with a purpose. This is particularly useful for things like password reset
|
602
|
+
or email verification, where you want the bearer of the signed id to be able to interact with the
|
603
|
+
underlying record, but usually only within a certain time period.
|
512
604
|
|
513
|
-
|
514
|
-
|
515
|
-
* Add `insert_all`/`insert_all!`/`upsert_all` methods to `ActiveRecord::Persistence`,
|
516
|
-
allowing bulk inserts akin to the bulk updates provided by `update_all` and
|
517
|
-
bulk deletes by `delete_all`.
|
605
|
+
```ruby
|
606
|
+
signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
|
518
607
|
|
519
|
-
|
520
|
-
for PostgreSQL (9.5+) and SQLite (3.24+) and `ON DUPLICATE KEY UPDATE` syntax
|
521
|
-
for MySQL.
|
608
|
+
User.find_signed signed_id # => nil, since the purpose does not match
|
522
609
|
|
523
|
-
|
610
|
+
travel 16.minutes
|
611
|
+
User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
|
524
612
|
|
525
|
-
|
526
|
-
|
613
|
+
travel_back
|
614
|
+
User.find_signed signed_id, purpose: :password_reset # => User.first
|
527
615
|
|
528
|
-
|
616
|
+
User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
|
617
|
+
```
|
529
618
|
|
530
|
-
*
|
619
|
+
*DHH*
|
531
620
|
|
532
|
-
|
621
|
+
* Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
|
533
622
|
|
534
|
-
*
|
623
|
+
*Ryuta Kamizono*
|
535
624
|
|
536
|
-
|
537
|
-
To continue case sensitive comparison on the case insensitive column,
|
538
|
-
pass `case_sensitive: true` option explicitly to the uniqueness validator.
|
625
|
+
* Fix index creation to preserve index comment in bulk change table on MySQL.
|
539
626
|
|
540
627
|
*Ryuta Kamizono*
|
541
628
|
|
542
|
-
*
|
629
|
+
* Allow `unscope` to be aware of table name qualified values.
|
543
630
|
|
544
|
-
|
631
|
+
It is possible to unscope only the column in the specified table.
|
545
632
|
|
546
|
-
|
633
|
+
```ruby
|
634
|
+
posts = Post.joins(:comments).group(:"posts.hidden")
|
635
|
+
posts = posts.where("posts.hidden": false, "comments.hidden": false)
|
547
636
|
|
548
|
-
|
637
|
+
posts.count
|
638
|
+
# => { false => 10 }
|
549
639
|
|
550
|
-
|
640
|
+
# unscope both hidden columns
|
641
|
+
posts.unscope(where: :hidden).count
|
642
|
+
# => { false => 11, true => 1 }
|
551
643
|
|
552
|
-
|
553
|
-
|
554
|
-
|
644
|
+
# unscope only comments.hidden column
|
645
|
+
posts.unscope(where: :"comments.hidden").count
|
646
|
+
# => { false => 11 }
|
647
|
+
```
|
555
648
|
|
556
|
-
|
557
|
-
Post.not_active # => where.not(status: :active)
|
558
|
-
Post.not_trashed # => where.not(status: :trashed)
|
649
|
+
*Ryuta Kamizono*, *Slava Korolev*
|
559
650
|
|
560
|
-
|
651
|
+
* Fix `rewhere` to truly overwrite collided where clause by new where clause.
|
561
652
|
|
562
|
-
|
653
|
+
```ruby
|
654
|
+
steve = Person.find_by(name: "Steve")
|
655
|
+
david = Author.find_by(name: "David")
|
563
656
|
|
564
|
-
|
657
|
+
relation = Essay.where(writer: steve)
|
565
658
|
|
566
|
-
|
659
|
+
# Before
|
660
|
+
relation.rewhere(writer: david).to_a # => []
|
567
661
|
|
662
|
+
# After
|
663
|
+
relation.rewhere(writer: david).to_a # => [david]
|
664
|
+
```
|
568
665
|
|
569
|
-
|
666
|
+
*Ryuta Kamizono*
|
570
667
|
|
571
|
-
*
|
668
|
+
* Inspect time attributes with subsec.
|
572
669
|
|
670
|
+
```ruby
|
671
|
+
p Knot.create
|
672
|
+
=> #<Knot id: 1, created_at: "2016-05-05 01:29:47.116928000">
|
673
|
+
```
|
573
674
|
|
574
|
-
|
675
|
+
*akinomaeni*
|
575
676
|
|
576
|
-
*
|
677
|
+
* Deprecate passing a column to `type_cast`.
|
577
678
|
|
578
679
|
*Ryuta Kamizono*
|
579
680
|
|
580
|
-
*
|
681
|
+
* Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
|
581
682
|
|
582
683
|
*Ryuta Kamizono*
|
583
684
|
|
584
|
-
*
|
585
|
-
|
586
|
-
*Ryuta Kamizono*
|
685
|
+
* Support bulk insert/upsert on relation to preserve scope values.
|
587
686
|
|
588
|
-
*
|
687
|
+
*Josef Šimánek*, *Ryuta Kamizono*
|
589
688
|
|
590
|
-
|
591
|
-
`destroy_all` on the matched records.
|
689
|
+
* Preserve column comment value on changing column name on MySQL.
|
592
690
|
|
593
|
-
|
691
|
+
*Islam Taha*
|
594
692
|
|
595
|
-
|
596
|
-
Person.destroy_by(name: 'David', rating: 4)
|
693
|
+
* Add support for `if_exists` option for removing an index.
|
597
694
|
|
598
|
-
|
599
|
-
david.posts.destroy_by(id: [1, 2, 3])
|
695
|
+
The `remove_index` method can take an `if_exists` option. If this is set to true an error won't be raised if the index doesn't exist.
|
600
696
|
|
601
|
-
|
602
|
-
`delete_all` on the matched records.
|
697
|
+
*Eileen M. Uchitelle*
|
603
698
|
|
604
|
-
|
699
|
+
* Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
|
605
700
|
|
606
|
-
|
607
|
-
Person.delete_by(name: 'David', rating: 4)
|
701
|
+
*Ryuta Kamizono*
|
608
702
|
|
609
|
-
|
610
|
-
david.posts.delete_by(id: [1, 2, 3])
|
703
|
+
* Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
|
611
704
|
|
612
|
-
|
705
|
+
Fixes #38219.
|
613
706
|
|
614
|
-
*
|
707
|
+
*Josh Brody*
|
615
708
|
|
616
|
-
|
709
|
+
* Add support for `if_not_exists` option for adding index.
|
617
710
|
|
618
|
-
|
711
|
+
The `add_index` method respects `if_not_exists` option. If it is set to true
|
712
|
+
index won't be added.
|
619
713
|
|
620
|
-
|
714
|
+
Usage:
|
621
715
|
|
622
|
-
|
716
|
+
```ruby
|
717
|
+
add_index :users, :account_id, if_not_exists: true
|
718
|
+
```
|
623
719
|
|
624
|
-
|
625
|
-
|
720
|
+
The `if_not_exists` option passed to `create_table` also gets propagated to indexes
|
721
|
+
created within that migration so that if table and its indexes exist then there is no
|
722
|
+
attempt to create them again.
|
626
723
|
|
627
|
-
*
|
724
|
+
*Prathamesh Sonpatki*
|
628
725
|
|
629
|
-
*
|
726
|
+
* Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
|
630
727
|
|
631
|
-
|
632
|
-
application to automatically switch between the writing and reading
|
633
|
-
database connections.
|
728
|
+
*Tom Ward*
|
634
729
|
|
635
|
-
|
636
|
-
a write in the last 2 seconds, otherwise they will read from the primary.
|
637
|
-
Non-get requests will always write to the primary. The middleware accepts
|
638
|
-
an argument for a Resolver class and an Operations class where you are able
|
639
|
-
to change how the auto-switcher works to be most beneficial for your
|
640
|
-
application.
|
730
|
+
* Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
|
641
731
|
|
642
|
-
|
643
|
-
configuration options:
|
732
|
+
Batch processing methods allow you to work with the records in batches, greatly reducing memory consumption, but records are always batched from oldest id to newest.
|
644
733
|
|
645
|
-
|
646
|
-
config.active_record.database_selector = { delay: 2.seconds }
|
647
|
-
config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
|
648
|
-
config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
|
649
|
-
```
|
734
|
+
This change allows reversing the order, batching from newest to oldest. This is useful when you need to process newer batches of records first.
|
650
735
|
|
651
|
-
|
652
|
-
configuration options:
|
736
|
+
Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
|
653
737
|
|
738
|
+
```ruby
|
739
|
+
Person.find_each(order: :desc) do |person|
|
740
|
+
person.party_all_night!
|
741
|
+
end
|
654
742
|
```
|
655
|
-
config.active_record.database_selector = { delay: 10.seconds }
|
656
|
-
config.active_record.database_resolver = MyResolver
|
657
|
-
config.active_record.database_resolver_context = MyResolver::MyCookies
|
658
|
-
```
|
659
|
-
|
660
|
-
*Eileen M. Uchitelle*
|
661
743
|
|
662
|
-
*
|
744
|
+
*Alexey Vasiliev*
|
663
745
|
|
664
|
-
|
665
|
-
|
666
|
-
* Make `t.timestamps` with precision by default.
|
667
|
-
|
668
|
-
*Ryuta Kamizono*
|
746
|
+
* Fix `insert_all` with enum values.
|
669
747
|
|
748
|
+
Fixes #38716.
|
670
749
|
|
671
|
-
|
750
|
+
*Joel Blum*
|
672
751
|
|
673
|
-
*
|
752
|
+
* Add support for `db:rollback:name` for multiple database applications.
|
674
753
|
|
675
|
-
|
754
|
+
Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
|
676
755
|
|
677
|
-
*
|
756
|
+
*Eileen M. Uchitelle*
|
678
757
|
|
679
|
-
|
758
|
+
* `Relation#pick` now uses already loaded results instead of making another query.
|
680
759
|
|
681
|
-
*
|
760
|
+
*Eugene Kenny*
|
682
761
|
|
683
|
-
|
762
|
+
* Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
|
684
763
|
|
685
|
-
*
|
764
|
+
*Dylan Thacker-Smith*
|
686
765
|
|
687
|
-
|
766
|
+
* Dump the schema or structure of a database when calling `db:migrate:name`.
|
688
767
|
|
689
|
-
|
768
|
+
In previous versions of Rails, `rails db:migrate` would dump the schema of the database. In Rails 6, that holds true (`rails db:migrate` dumps all databases' schemas), but `rails db:migrate:name` does not share that behavior.
|
690
769
|
|
691
|
-
|
770
|
+
Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
|
692
771
|
|
693
|
-
*
|
772
|
+
*Kyle Thompson*
|
694
773
|
|
695
|
-
|
774
|
+
* Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
|
696
775
|
|
697
|
-
|
776
|
+
When `rails db:migrate` has finished, it ensures the `ActiveRecord::Base` connection is reset to its original configuration. Going forward, `rails db:migrate:name` will have the same behavior.
|
698
777
|
|
699
|
-
*
|
778
|
+
*Kyle Thompson*
|
700
779
|
|
701
|
-
*
|
780
|
+
* Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
|
702
781
|
|
703
|
-
|
782
|
+
Behavior has not changed here but the previous API could be misleading to people who thought it would switch connections for only that class. `connected_to` switches the context from which we are getting connections, not the connections themselves.
|
704
783
|
|
705
|
-
*
|
784
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
706
785
|
|
707
|
-
|
786
|
+
* Add support for horizontal sharding to `connects_to` and `connected_to`.
|
708
787
|
|
709
|
-
|
788
|
+
Applications can now connect to multiple shards and switch between their shards in an application. Note that the shard swapping is still a manual process as this change does not include an API for automatic shard swapping.
|
710
789
|
|
711
|
-
|
790
|
+
Usage:
|
712
791
|
|
713
|
-
|
792
|
+
Given the following configuration:
|
714
793
|
|
715
|
-
|
794
|
+
```yaml
|
795
|
+
# config/database.yml
|
796
|
+
production:
|
797
|
+
primary:
|
798
|
+
database: my_database
|
799
|
+
primary_shard_one:
|
800
|
+
database: my_database_shard_one
|
801
|
+
```
|
716
802
|
|
717
|
-
|
803
|
+
Connect to multiple shards:
|
718
804
|
|
719
|
-
|
805
|
+
```ruby
|
806
|
+
class ApplicationRecord < ActiveRecord::Base
|
807
|
+
self.abstract_class = true
|
720
808
|
|
721
|
-
|
809
|
+
connects_to shards: {
|
810
|
+
default: { writing: :primary },
|
811
|
+
shard_one: { writing: :primary_shard_one }
|
812
|
+
}
|
813
|
+
```
|
722
814
|
|
723
|
-
|
815
|
+
Swap between shards in your controller / model code:
|
724
816
|
|
725
|
-
|
817
|
+
```ruby
|
818
|
+
ActiveRecord::Base.connected_to(shard: :shard_one) do
|
819
|
+
# Read from shard one
|
820
|
+
end
|
821
|
+
```
|
726
822
|
|
727
|
-
|
823
|
+
The horizontal sharding API also supports read replicas. See guides for more details.
|
728
824
|
|
729
|
-
*
|
825
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
730
826
|
|
731
|
-
*
|
827
|
+
* Deprecate `spec_name` in favor of `name` on database configurations.
|
732
828
|
|
733
|
-
|
829
|
+
The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
|
734
830
|
|
735
|
-
|
831
|
+
Deprecated behavior:
|
736
832
|
|
737
|
-
|
833
|
+
```ruby
|
834
|
+
db_config = ActiveRecord::Base.configs_for(env_name: "development", spec_name: "primary")
|
835
|
+
db_config.spec_name
|
836
|
+
```
|
738
837
|
|
739
|
-
|
838
|
+
New behavior:
|
740
839
|
|
741
|
-
|
840
|
+
```ruby
|
841
|
+
db_config = ActiveRecord::Base.configs_for(env_name: "development", name: "primary")
|
842
|
+
db_config.name
|
843
|
+
```
|
742
844
|
|
743
|
-
*
|
845
|
+
*Eileen M. Uchitelle*
|
744
846
|
|
745
|
-
|
746
|
-
format for InnoDB tables. The default setting is `DYNAMIC`.
|
747
|
-
The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
|
847
|
+
* Add additional database-specific rake tasks for multi-database users.
|
748
848
|
|
749
|
-
|
849
|
+
Previously, `rails db:create`, `rails db:drop`, and `rails db:migrate` were the only rails tasks that could operate on a single
|
850
|
+
database. For example:
|
750
851
|
|
751
|
-
|
852
|
+
```
|
853
|
+
rails db:create
|
854
|
+
rails db:create:primary
|
855
|
+
rails db:create:animals
|
856
|
+
rails db:drop
|
857
|
+
rails db:drop:primary
|
858
|
+
rails db:drop:animals
|
859
|
+
rails db:migrate
|
860
|
+
rails db:migrate:primary
|
861
|
+
rails db:migrate:animals
|
862
|
+
```
|
752
863
|
|
753
|
-
|
864
|
+
With these changes, `rails db:schema:dump`, `rails db:schema:load`, `rails db:structure:dump`, `rails db:structure:load` and
|
865
|
+
`rails db:test:prepare` can additionally operate on a single database. For example:
|
754
866
|
|
755
|
-
|
867
|
+
```
|
868
|
+
rails db:schema:dump
|
869
|
+
rails db:schema:dump:primary
|
870
|
+
rails db:schema:dump:animals
|
871
|
+
rails db:schema:load
|
872
|
+
rails db:schema:load:primary
|
873
|
+
rails db:schema:load:animals
|
874
|
+
rails db:structure:dump
|
875
|
+
rails db:structure:dump:primary
|
876
|
+
rails db:structure:dump:animals
|
877
|
+
rails db:structure:load
|
878
|
+
rails db:structure:load:primary
|
879
|
+
rails db:structure:load:animals
|
880
|
+
rails db:test:prepare
|
881
|
+
rails db:test:prepare:primary
|
882
|
+
rails db:test:prepare:animals
|
883
|
+
```
|
756
884
|
|
757
|
-
*
|
885
|
+
*Kyle Thompson*
|
758
886
|
|
759
|
-
*
|
887
|
+
* Add support for `strict_loading` mode on association declarations.
|
760
888
|
|
761
|
-
|
889
|
+
Raise an error if attempting to load a record from an association that has been marked as `strict_loading` unless it was explicitly eager loaded.
|
762
890
|
|
763
|
-
|
891
|
+
Usage:
|
764
892
|
|
765
|
-
|
893
|
+
```ruby
|
894
|
+
class Developer < ApplicationRecord
|
895
|
+
has_many :projects, strict_loading: true
|
896
|
+
end
|
766
897
|
|
767
|
-
|
898
|
+
dev = Developer.first
|
899
|
+
dev.projects.first
|
900
|
+
# => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
|
901
|
+
```
|
768
902
|
|
769
|
-
|
770
|
-
you're building out multiple databases and want to make sure you're not sending
|
771
|
-
writes when you want a read.
|
903
|
+
*Kevin Deisz*
|
772
904
|
|
773
|
-
|
774
|
-
query the database will raise an exception regardless of whether the database
|
775
|
-
user is able to write.
|
905
|
+
* Add support for `strict_loading` mode to prevent lazy loading of records.
|
776
906
|
|
777
|
-
|
778
|
-
read-only queries without opening a second connection. One purpose of this is to
|
779
|
-
catch accidental writes, not all writes.
|
907
|
+
Raise an error if a parent record is marked as `strict_loading` and attempts to lazily load its associations. This is useful for finding places you may want to preload an association and avoid additional queries.
|
780
908
|
|
781
|
-
|
909
|
+
Usage:
|
782
910
|
|
783
|
-
|
911
|
+
```ruby
|
912
|
+
dev = Developer.strict_loading.first
|
913
|
+
dev.audit_logs.to_a
|
914
|
+
# => ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
|
915
|
+
```
|
784
916
|
|
785
|
-
*
|
917
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
786
918
|
|
787
|
-
*
|
919
|
+
* Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
|
788
920
|
|
789
|
-
|
921
|
+
*Sebastián Palma*
|
790
922
|
|
791
|
-
|
923
|
+
* Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
|
792
924
|
|
793
|
-
|
925
|
+
Applications can set their migrations to ignore exceptions raised when adding a column that already exists or when removing a column that does not exist.
|
794
926
|
|
795
|
-
|
796
|
-
was passing for SQLite and MySQL, but failed for PostgreSQL:
|
927
|
+
Example Usage:
|
797
928
|
|
798
929
|
```ruby
|
799
|
-
class
|
800
|
-
def
|
801
|
-
|
930
|
+
class AddColumnTitle < ActiveRecord::Migration[6.1]
|
931
|
+
def change
|
932
|
+
add_column :posts, :title, :string, if_not_exists: true
|
802
933
|
end
|
803
934
|
end
|
935
|
+
```
|
804
936
|
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
self.ignored_columns += ["name"]
|
937
|
+
```ruby
|
938
|
+
class RemoveColumnTitle < ActiveRecord::Migration[6.1]
|
939
|
+
def change
|
940
|
+
remove_column :posts, :title, if_exists: true
|
941
|
+
end
|
811
942
|
end
|
812
|
-
|
813
|
-
developer = AttributedDeveloper.create
|
814
|
-
developer.update_column :name, "name"
|
815
|
-
|
816
|
-
loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
|
817
|
-
puts loaded_developer.name # should be "Developer: name" but it's just "name"
|
818
943
|
```
|
819
944
|
|
820
|
-
*
|
821
|
-
|
822
|
-
* Make the implicit order column configurable.
|
823
|
-
|
824
|
-
When calling ordered finder methods such as `first` or `last` without an
|
825
|
-
explicit order clause, ActiveRecord sorts records by primary key. This can
|
826
|
-
result in unpredictable and surprising behaviour when the primary key is
|
827
|
-
not an auto-incrementing integer, for example when it's a UUID. This change
|
828
|
-
makes it possible to override the column used for implicit ordering such
|
829
|
-
that `first` and `last` will return more predictable results.
|
830
|
-
|
831
|
-
Example:
|
832
|
-
|
833
|
-
class Project < ActiveRecord::Base
|
834
|
-
self.implicit_order_column = "created_at"
|
835
|
-
end
|
836
|
-
|
837
|
-
*Tekin Suleyman*
|
945
|
+
*Eileen M. Uchitelle*
|
838
946
|
|
839
|
-
*
|
947
|
+
* Regexp-escape table name for MS SQL Server.
|
840
948
|
|
841
|
-
|
949
|
+
Add `Regexp.escape` to one method in ActiveRecord, so that table names with regular expression characters in them work as expected. Since MS SQL Server uses "[" and "]" to quote table and column names, and those characters are regular expression characters, methods like `pluck` and `select` fail in certain cases when used with the MS SQL Server adapter.
|
842
950
|
|
843
|
-
*
|
951
|
+
*Larry Reid*
|
844
952
|
|
845
|
-
|
953
|
+
* Store advisory locks on their own named connection.
|
846
954
|
|
847
|
-
|
955
|
+
Previously advisory locks were taken out against a connection when a migration started. This works fine in single database applications but doesn't work well when migrations need to open new connections which results in the lock getting dropped.
|
848
956
|
|
849
|
-
|
957
|
+
In order to fix this we are storing the advisory lock on a new connection with the connection specification name `AdvisoryLockBase`. The caveat is that we need to maintain at least 2 connections to a database while migrations are running in order to do this.
|
850
958
|
|
851
|
-
|
959
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
852
960
|
|
853
|
-
|
961
|
+
* Allow schema cache path to be defined in the database configuration file.
|
854
962
|
|
855
|
-
|
963
|
+
For example:
|
856
964
|
|
857
|
-
```
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
965
|
+
```yaml
|
966
|
+
development:
|
967
|
+
adapter: postgresql
|
968
|
+
database: blog_development
|
969
|
+
pool: 5
|
970
|
+
schema_cache_path: tmp/schema/main.yml
|
863
971
|
```
|
864
972
|
|
865
|
-
*
|
973
|
+
*Katrina Owen*
|
866
974
|
|
867
|
-
*
|
975
|
+
* Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
|
868
976
|
|
869
|
-
|
977
|
+
`#remove_connection` is deprecated in order to support returning a `DatabaseConfig` object instead of a `Hash`. Use `#remove_connection_pool`, `#remove_connection` will be removed in 6.2.
|
870
978
|
|
871
|
-
|
872
|
-
t.string :title
|
873
|
-
end
|
874
|
-
|
875
|
-
That would execute:
|
876
|
-
|
877
|
-
CREATE TABLE IF NOT EXISTS posts (
|
878
|
-
...
|
879
|
-
)
|
880
|
-
|
881
|
-
If the table already exists, `if_not_exists: false` (the default) raises an
|
882
|
-
exception whereas `if_not_exists: true` does nothing.
|
979
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
883
980
|
|
884
|
-
|
981
|
+
* Deprecate `#default_hash` and it's alias `#[]` on database configurations.
|
885
982
|
|
886
|
-
|
983
|
+
Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
|
887
984
|
|
888
|
-
*
|
985
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
889
986
|
|
890
|
-
*
|
987
|
+
* Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
|
891
988
|
|
892
989
|
*Gannon McGibbon*
|
893
990
|
|
894
|
-
*
|
895
|
-
if the attribute does not exist.
|
991
|
+
* Find orphans by looking for missing relations through chaining `where.missing`:
|
896
992
|
|
897
|
-
|
993
|
+
Before:
|
898
994
|
|
899
|
-
|
995
|
+
```ruby
|
996
|
+
Post.left_joins(:author).where(authors: { id: nil })
|
997
|
+
```
|
900
998
|
|
901
|
-
|
902
|
-
User.connected_to(database: { writing: "postgres://foo" }) do
|
903
|
-
User.create!(name: "Gannon")
|
904
|
-
end
|
999
|
+
After:
|
905
1000
|
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
end
|
910
|
-
````
|
1001
|
+
```ruby
|
1002
|
+
Post.where.missing(:author)
|
1003
|
+
```
|
911
1004
|
|
912
|
-
*
|
1005
|
+
*Tom Rossi*
|
913
1006
|
|
914
|
-
*
|
1007
|
+
* Ensure `:reading` connections always raise if a write is attempted.
|
915
1008
|
|
916
|
-
|
1009
|
+
Now Rails will raise an `ActiveRecord::ReadOnlyError` if any connection on the reading handler attempts to make a write. If your reading role needs to write you should name the role something other than `:reading`.
|
917
1010
|
|
918
|
-
|
1011
|
+
*Eileen M. Uchitelle*
|
919
1012
|
|
920
|
-
|
1013
|
+
* Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
|
921
1014
|
|
922
|
-
|
1015
|
+
`"primary"` has been deprecated as the `connection_specification_name` for `ActiveRecord::Base` in favor of using `"ActiveRecord::Base"`. This change affects calls to `ActiveRecord::Base.connection_handler.retrieve_connection` and `ActiveRecord::Base.connection_handler.remove_connection`. If you're calling these methods with `"primary"`, please switch to `"ActiveRecord::Base"`.
|
923
1016
|
|
924
|
-
|
925
|
-
expression values rather than column or column prefix values.
|
1017
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
926
1018
|
|
927
|
-
|
1019
|
+
* Add `ActiveRecord::Validations::NumericalityValidator` with
|
1020
|
+
support for casting floats using a database columns' precision value.
|
928
1021
|
|
929
|
-
*
|
1022
|
+
*Gannon McGibbon*
|
930
1023
|
|
931
|
-
*
|
1024
|
+
* Enforce fresh ETag header after a collection's contents change by adding
|
1025
|
+
ActiveRecord::Relation#cache_key_with_version. This method will be used by
|
1026
|
+
ActionController::ConditionalGet to ensure that when collection cache versioning
|
1027
|
+
is enabled, requests using ConditionalGet don't return the same ETag header
|
1028
|
+
after a collection is modified.
|
932
1029
|
|
933
|
-
Fixes #
|
1030
|
+
Fixes #38078.
|
934
1031
|
|
935
|
-
*
|
1032
|
+
*Aaron Lipman*
|
936
1033
|
|
937
|
-
*
|
1034
|
+
* Skip test database when running `db:create` or `db:drop` in development
|
1035
|
+
with `DATABASE_URL` set.
|
938
1036
|
|
939
|
-
|
1037
|
+
*Brian Buchalter*
|
940
1038
|
|
941
|
-
|
942
|
-
class AnimalsModel < ApplicationRecord
|
943
|
-
self.abstract_class = true
|
1039
|
+
* Don't allow mutations on the database configurations hash.
|
944
1040
|
|
945
|
-
|
946
|
-
end
|
1041
|
+
Freeze the configurations hash to disallow directly changing it. If applications need to change the hash, for example to create databases for parallelization, they should use the `DatabaseConfig` object directly.
|
947
1042
|
|
948
|
-
|
949
|
-
# connected to both the animals_primary db for writing and the animals_replica for reading
|
950
|
-
end
|
951
|
-
```
|
952
|
-
|
953
|
-
2) Adds a `connected_to` block method for switching connection roles or connecting to
|
954
|
-
a database that the model didn't connect to. Connecting to the database in this block is
|
955
|
-
useful when you have another defined connection, for example `slow_replica` that you don't
|
956
|
-
want to connect to by default but need in the console, or a specific code block.
|
1043
|
+
Before:
|
957
1044
|
|
958
|
-
```
|
959
|
-
ActiveRecord::Base.
|
960
|
-
|
961
|
-
Book.first # doesn't have a reading connection, will raise an error
|
962
|
-
end
|
1045
|
+
```ruby
|
1046
|
+
@db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
|
1047
|
+
@db_config.configuration_hash.merge!(idle_timeout: "0.02")
|
963
1048
|
```
|
964
1049
|
|
965
|
-
|
966
|
-
ActiveRecord::Base.connected_to(database: :slow_replica) do
|
967
|
-
SlowReplicaModel.first # if the db config has a slow_replica configuration this will be used to do the lookup, otherwise this will throw an exception
|
968
|
-
end
|
969
|
-
```
|
1050
|
+
After:
|
970
1051
|
|
971
|
-
|
1052
|
+
```ruby
|
1053
|
+
@db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", spec_name: "primary")
|
1054
|
+
config = @db_config.configuration_hash.merge(idle_timeout: "0.02")
|
1055
|
+
db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(@db_config.env_name, @db_config.spec_name, config)
|
1056
|
+
```
|
972
1057
|
|
973
|
-
*
|
1058
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
974
1059
|
|
975
|
-
|
976
|
-
commit checks that only valid definition values are provided, those can
|
977
|
-
be a Hash, an array of Symbols or an array of Strings. Otherwise it
|
978
|
-
raises an `ArgumentError`.
|
1060
|
+
* Remove `:connection_id` from the `sql.active_record` notification.
|
979
1061
|
|
980
|
-
|
1062
|
+
*Aaron Patterson*, *Rafael Mendonça França*
|
981
1063
|
|
982
|
-
|
1064
|
+
* The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
|
983
1065
|
|
984
|
-
*
|
1066
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
985
1067
|
|
986
|
-
|
987
|
-
class Post < ActiveRecord::Base
|
988
|
-
has_one :category
|
989
|
-
belongs_to :author
|
990
|
-
has_many :comments
|
991
|
-
end
|
1068
|
+
* ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
|
992
1069
|
|
993
|
-
|
994
|
-
|
995
|
-
post.reload_author
|
996
|
-
post.comments.reload
|
997
|
-
```
|
1070
|
+
You can now opt-out/opt-in specific models from having their associations required
|
1071
|
+
by default.
|
998
1072
|
|
999
|
-
|
1073
|
+
This change is meant to ease the process of migrating all your models to have
|
1074
|
+
their association required.
|
1000
1075
|
|
1001
|
-
*
|
1002
|
-
With this change you can create indexes while adding new
|
1003
|
-
columns into the existing tables.
|
1076
|
+
*Edouard Chin*
|
1004
1077
|
|
1005
|
-
|
1078
|
+
* The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
|
1006
1079
|
|
1007
|
-
|
1008
|
-
t.string :country_code, index: true
|
1009
|
-
end
|
1080
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1010
1081
|
|
1011
|
-
|
1082
|
+
* Retain explicit selections on the base model after applying `includes` and `joins`.
|
1012
1083
|
|
1013
|
-
|
1084
|
+
Resolves #34889.
|
1014
1085
|
|
1015
|
-
|
1016
|
-
Now: This change fixes that by reverting commands inside `transaction` block.
|
1086
|
+
*Patrick Rebsch*
|
1017
1087
|
|
1018
|
-
|
1088
|
+
* The `database` kwarg is deprecated without replacement because it can't be used for sharding and creates an issue if it's used during a request. Applications that need to create new connections should use `connects_to` instead.
|
1019
1089
|
|
1020
|
-
*
|
1090
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1021
1091
|
|
1022
|
-
|
1092
|
+
* Allow attributes to be fetched from Arel node groupings.
|
1023
1093
|
|
1024
|
-
*
|
1094
|
+
*Jeff Emminger*, *Gannon McGibbon*
|
1025
1095
|
|
1026
|
-
|
1096
|
+
* A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
|
1027
1097
|
|
1028
|
-
*
|
1098
|
+
*Joshua Flanagan*
|
1029
1099
|
|
1030
|
-
|
1100
|
+
* Calling methods like `establish_connection` with a `Hash` which is invalid (eg: no `adapter`) will now raise an error the same way as connections defined in `config/database.yml`.
|
1031
1101
|
|
1032
|
-
*
|
1102
|
+
*John Crepezzi*
|
1033
1103
|
|
1034
|
-
*
|
1104
|
+
* Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
|
1035
1105
|
|
1036
|
-
*
|
1106
|
+
*Paweł Urbanek*
|
1037
1107
|
|
1038
|
-
*
|
1108
|
+
* `where(attr => [])` now loads an empty result without making a query.
|
1039
1109
|
|
1040
|
-
|
1041
|
-
create_table :users do |t|
|
1042
|
-
t.string :email
|
1043
|
-
end
|
1110
|
+
*John Hawthorn*
|
1044
1111
|
|
1045
|
-
|
1046
|
-
```
|
1112
|
+
* Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
|
1047
1113
|
|
1048
|
-
*
|
1114
|
+
*Hiroyuki Ishii*
|
1049
1115
|
|
1050
|
-
*
|
1116
|
+
* Add support for `belongs_to` to `has_many` inversing.
|
1051
1117
|
|
1052
|
-
|
1118
|
+
*Gannon McGibbon*
|
1053
1119
|
|
1054
|
-
|
1120
|
+
* Allow length configuration for `has_secure_token` method. The minimum length
|
1121
|
+
is set at 24 characters.
|
1055
1122
|
|
1056
|
-
|
1123
|
+
Before:
|
1057
1124
|
|
1058
|
-
|
1125
|
+
```ruby
|
1126
|
+
has_secure_token :auth_token
|
1127
|
+
```
|
1059
1128
|
|
1060
|
-
|
1129
|
+
After:
|
1061
1130
|
|
1062
|
-
|
1063
|
-
|
1131
|
+
```ruby
|
1132
|
+
has_secure_token :default_token # 24 characters
|
1133
|
+
has_secure_token :auth_token, length: 36 # 36 characters
|
1134
|
+
has_secure_token :invalid_token, length: 12 # => ActiveRecord::SecureToken::MinimumLengthError
|
1135
|
+
```
|
1064
1136
|
|
1065
|
-
*
|
1137
|
+
*Bernardo de Araujo*
|
1066
1138
|
|
1067
|
-
*
|
1139
|
+
* Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
|
1068
1140
|
|
1069
|
-
*
|
1141
|
+
*Eileen Uchitelle*, *John Crepezzi*
|
1070
1142
|
|
1071
|
-
*
|
1072
|
-
sensitive values of database columns when calling `#inspect`.
|
1073
|
-
We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
|
1074
|
-
specify sensitive attributes to specific model.
|
1143
|
+
* Add `DatabaseConfig#configuration_hash` to return database configuration hashes with symbol keys, and use all symbol-key configuration hashes internally. Deprecate `DatabaseConfig#config` which returns a String-keyed `Hash` with the same values.
|
1075
1144
|
|
1076
|
-
|
1077
|
-
Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
|
1078
|
-
Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
|
1079
|
-
SecureAccount.filter_attributes += [:name]
|
1080
|
-
SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
|
1081
|
-
```
|
1145
|
+
*John Crepezzi*, *Eileen Uchitelle*
|
1082
1146
|
|
1083
|
-
|
1147
|
+
* Allow column names to be passed to `remove_index` positionally along with other options.
|
1084
1148
|
|
1085
|
-
|
1086
|
-
`indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
|
1087
|
-
and `joins_per_query` methods in `DatabaseLimits`.
|
1149
|
+
Passing other options can be necessary to make `remove_index` correctly reversible.
|
1088
1150
|
|
1089
|
-
|
1151
|
+
Before:
|
1090
1152
|
|
1091
|
-
|
1153
|
+
add_index :reports, :report_id # => works
|
1154
|
+
add_index :reports, :report_id, unique: true # => works
|
1155
|
+
remove_index :reports, :report_id # => works
|
1156
|
+
remove_index :reports, :report_id, unique: true # => ArgumentError
|
1092
1157
|
|
1093
|
-
|
1094
|
-
is an inflexible data model. In order to improve multiple-database
|
1095
|
-
handling in Rails, we've changed this to return an object. Some methods
|
1096
|
-
are provided to make the object behave hash-like in order to ease the
|
1097
|
-
transition process. Since most applications don't manipulate the hash
|
1098
|
-
we've decided to add backwards-compatible functionality that will throw
|
1099
|
-
a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
|
1100
|
-
will use the new version internally and externally.
|
1158
|
+
After:
|
1101
1159
|
|
1102
|
-
|
1160
|
+
remove_index :reports, :report_id, unique: true # => works
|
1103
1161
|
|
1104
|
-
|
1105
|
-
development:
|
1106
|
-
adapter: sqlite3
|
1107
|
-
database: db/development.sqlite3
|
1108
|
-
```
|
1162
|
+
*Eugene Kenny*
|
1109
1163
|
|
1110
|
-
|
1164
|
+
* Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
|
1111
1165
|
|
1112
|
-
|
1113
|
-
{ "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
|
1114
|
-
```
|
1166
|
+
*Eugene Kenny*
|
1115
1167
|
|
1116
|
-
|
1168
|
+
* `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
|
1117
1169
|
|
1118
|
-
|
1119
|
-
#<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
|
1120
|
-
#<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
|
1121
|
-
@spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
|
1122
|
-
]
|
1123
|
-
```
|
1170
|
+
*Eugene Kenny*
|
1124
1171
|
|
1125
|
-
|
1126
|
-
calling hash methods on the `configurations` hash directly, a new method `configs_for` has
|
1127
|
-
been provided that allows you to select the correct configuration. `env_name` and
|
1128
|
-
`spec_name` arguments are optional. For example, these return an array of
|
1129
|
-
database config objects for the requested environment and a single database config object
|
1130
|
-
will be returned for the requested environment and specification name respectively.
|
1172
|
+
* Call `while_preventing_writes` directly from `connected_to`.
|
1131
1173
|
|
1132
|
-
|
1133
|
-
ActiveRecord::Base.configurations.configs_for(env_name: "development")
|
1134
|
-
ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
|
1135
|
-
```
|
1174
|
+
In some cases application authors want to use the database switching middleware and make explicit calls with `connected_to`. It's possible for an app to turn off writes and not turn them back on by the time we call `connected_to(role: :writing)`.
|
1136
1175
|
|
1137
|
-
|
1176
|
+
This change allows apps to fix this by assuming if a role is writing we want to allow writes, except in the case it's explicitly turned off.
|
1138
1177
|
|
1139
|
-
*
|
1178
|
+
*Eileen M. Uchitelle*
|
1140
1179
|
|
1141
|
-
|
1142
|
-
production:
|
1143
|
-
adapter: postgresql
|
1144
|
-
advisory_locks: false
|
1145
|
-
```
|
1180
|
+
* Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
|
1146
1181
|
|
1147
|
-
*
|
1182
|
+
*Kir Shatrov*
|
1148
1183
|
|
1149
|
-
*
|
1184
|
+
* Stop trying to read yaml file fixtures when loading Active Record fixtures.
|
1150
1185
|
|
1151
|
-
*
|
1186
|
+
*Gannon McGibbon*
|
1152
1187
|
|
1153
|
-
*
|
1188
|
+
* Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
|
1154
1189
|
|
1155
|
-
|
1190
|
+
To continue taking non-deterministic result, use `.take` / `.take!` instead.
|
1156
1191
|
|
1157
|
-
|
1192
|
+
*Ryuta Kamizono*
|
1158
1193
|
|
1159
|
-
|
1194
|
+
* Preserve user supplied joins order as much as possible.
|
1160
1195
|
|
1161
|
-
|
1162
|
-
seed load in environments without Rails and custom DB configuration
|
1196
|
+
Fixes #36761, #34328, #24281, #12953.
|
1163
1197
|
|
1164
|
-
*
|
1198
|
+
*Ryuta Kamizono*
|
1165
1199
|
|
1166
|
-
*
|
1200
|
+
* Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
|
1167
1201
|
|
1168
|
-
*
|
1202
|
+
*James Pearson*
|
1169
1203
|
|
1170
|
-
*
|
1204
|
+
* Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
|
1171
1205
|
|
1172
|
-
*
|
1206
|
+
*Tongfei Gao*
|
1173
1207
|
|
1174
|
-
*
|
1208
|
+
* Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
|
1175
1209
|
|
1176
|
-
|
1210
|
+
*John Crepezzi*, *Eileen Uchitelle*
|
1177
1211
|
|
1178
|
-
|
1212
|
+
* Add a warning for enum elements with 'not_' prefix.
|
1179
1213
|
|
1180
|
-
|
1214
|
+
class Foo
|
1215
|
+
enum status: [:sent, :not_sent]
|
1216
|
+
end
|
1181
1217
|
|
1182
|
-
*
|
1218
|
+
*Edu Depetris*
|
1183
1219
|
|
1184
|
-
*
|
1220
|
+
* Make currency symbols optional for money column type in PostgreSQL.
|
1185
1221
|
|
1186
|
-
|
1222
|
+
*Joel Schneider*
|
1187
1223
|
|
1188
|
-
|
1224
|
+
* Add support for beginless ranges, introduced in Ruby 2.7.
|
1189
1225
|
|
1190
|
-
*
|
1226
|
+
*Josh Goodall*
|
1191
1227
|
|
1192
|
-
|
1228
|
+
* Add `database_exists?` method to connection adapters to check if a database exists.
|
1193
1229
|
|
1194
|
-
*
|
1195
|
-
use loaded association ids if present.
|
1230
|
+
*Guilherme Mansur*
|
1196
1231
|
|
1197
|
-
|
1232
|
+
* Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
|
1198
1233
|
|
1199
|
-
*
|
1234
|
+
*Guilherme Mansur*, *Eugene Kenny*
|
1200
1235
|
|
1201
|
-
|
1236
|
+
* PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
|
1202
1237
|
|
1203
|
-
|
1238
|
+
Fixes #36022.
|
1204
1239
|
|
1205
|
-
|
1240
|
+
*Ryuta Kamizono*
|
1206
1241
|
|
1207
|
-
|
1242
|
+
* Make ActiveRecord `ConnectionPool.connections` method thread-safe.
|
1208
1243
|
|
1209
|
-
|
1244
|
+
Fixes #36465.
|
1210
1245
|
|
1211
|
-
*
|
1246
|
+
*Jeff Doering*
|
1212
1247
|
|
1213
|
-
|
1248
|
+
* Add support for multiple databases to `rails db:abort_if_pending_migrations`.
|
1214
1249
|
|
1215
|
-
*
|
1250
|
+
*Mark Lee*
|
1216
1251
|
|
1217
|
-
|
1252
|
+
* Fix sqlite3 collation parsing when using decimal columns.
|
1218
1253
|
|
1219
|
-
*
|
1254
|
+
*Martin R. Schuster*
|
1220
1255
|
|
1221
|
-
|
1256
|
+
* Fix invalid schema when primary key column has a comment.
|
1222
1257
|
|
1223
|
-
|
1258
|
+
Fixes #29966.
|
1224
1259
|
|
1225
|
-
*
|
1260
|
+
*Guilherme Goettems Schneider*
|
1226
1261
|
|
1227
|
-
*
|
1228
|
-
`ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
|
1262
|
+
* Fix table comment also being applied to the primary key column.
|
1229
1263
|
|
1230
|
-
*
|
1264
|
+
*Guilherme Goettems Schneider*
|
1231
1265
|
|
1232
|
-
*
|
1266
|
+
* Allow generated `create_table` migrations to include or skip timestamps.
|
1233
1267
|
|
1234
|
-
*
|
1268
|
+
*Michael Duchemin*
|
1235
1269
|
|
1236
1270
|
|
1237
|
-
Please check [
|
1271
|
+
Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.
|