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