activerecord 5.2.3 → 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 +898 -532
- data/MIT-LICENSE +3 -1
- data/README.rdoc +7 -5
- data/examples/performance.rb +1 -1
- data/lib/active_record/aggregations.rb +5 -4
- data/lib/active_record/association_relation.rb +22 -12
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +95 -42
- data/lib/active_record/associations/association_scope.rb +21 -21
- data/lib/active_record/associations/belongs_to_association.rb +50 -46
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -5
- data/lib/active_record/associations/builder/association.rb +23 -21
- data/lib/active_record/associations/builder/belongs_to.rb +29 -59
- data/lib/active_record/associations/builder/collection_association.rb +10 -19
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -41
- data/lib/active_record/associations/builder/has_many.rb +8 -2
- data/lib/active_record/associations/builder/has_one.rb +33 -2
- data/lib/active_record/associations/builder/singular_association.rb +3 -1
- data/lib/active_record/associations/collection_association.rb +31 -29
- data/lib/active_record/associations/collection_proxy.rb +25 -21
- data/lib/active_record/associations/foreign_association.rb +20 -0
- data/lib/active_record/associations/has_many_association.rb +26 -13
- data/lib/active_record/associations/has_many_through_association.rb +27 -28
- data/lib/active_record/associations/has_one_association.rb +43 -31
- data/lib/active_record/associations/has_one_through_association.rb +5 -5
- data/lib/active_record/associations/join_dependency/join_association.rb +54 -12
- data/lib/active_record/associations/join_dependency/join_part.rb +5 -5
- data/lib/active_record/associations/join_dependency.rb +91 -60
- data/lib/active_record/associations/preloader/association.rb +71 -43
- data/lib/active_record/associations/preloader/through_association.rb +49 -40
- data/lib/active_record/associations/preloader.rb +48 -35
- data/lib/active_record/associations/singular_association.rb +3 -17
- data/lib/active_record/associations/through_association.rb +1 -1
- data/lib/active_record/associations.rb +133 -25
- data/lib/active_record/attribute_assignment.rb +17 -19
- data/lib/active_record/attribute_methods/before_type_cast.rb +13 -7
- data/lib/active_record/attribute_methods/dirty.rb +101 -40
- data/lib/active_record/attribute_methods/primary_key.rb +20 -25
- data/lib/active_record/attribute_methods/query.rb +4 -8
- data/lib/active_record/attribute_methods/read.rb +14 -56
- data/lib/active_record/attribute_methods/serialization.rb +12 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +12 -15
- data/lib/active_record/attribute_methods/write.rb +18 -34
- data/lib/active_record/attribute_methods.rb +81 -143
- data/lib/active_record/attributes.rb +45 -8
- data/lib/active_record/autosave_association.rb +76 -47
- data/lib/active_record/base.rb +4 -17
- data/lib/active_record/callbacks.rb +158 -43
- data/lib/active_record/coders/yaml_column.rb +1 -2
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +293 -132
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -36
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +167 -146
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +21 -17
- data/lib/active_record/connection_adapters/abstract/quoting.rb +98 -47
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +153 -110
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +203 -90
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -4
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +381 -146
- data/lib/active_record/connection_adapters/abstract/transaction.rb +155 -68
- data/lib/active_record/connection_adapters/abstract_adapter.rb +229 -98
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +243 -275
- data/lib/active_record/connection_adapters/column.rb +30 -12
- 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 +86 -32
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +34 -10
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +48 -32
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +14 -6
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +139 -19
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +14 -9
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +53 -18
- 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 +37 -28
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +38 -54
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
- 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 +1 -2
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +3 -4
- 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/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +3 -4
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +25 -7
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +15 -3
- data/lib/active_record/connection_adapters/postgresql/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +47 -10
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +19 -4
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +120 -100
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +31 -26
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +222 -112
- data/lib/active_record/connection_adapters/schema_cache.rb +127 -21
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +19 -6
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +144 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -7
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +5 -1
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +77 -13
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +175 -187
- 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 +285 -33
- data/lib/active_record/core.rb +308 -100
- data/lib/active_record/counter_cache.rb +8 -30
- data/lib/active_record/database_configurations/connection_url_resolver.rb +98 -0
- data/lib/active_record/database_configurations/database_config.rb +80 -0
- data/lib/active_record/database_configurations/hash_config.rb +96 -0
- data/lib/active_record/database_configurations/url_config.rb +53 -0
- data/lib/active_record/database_configurations.rb +272 -0
- 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 +3 -4
- data/lib/active_record/enum.rb +71 -17
- data/lib/active_record/errors.rb +62 -19
- data/lib/active_record/explain.rb +10 -6
- 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 +32 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +152 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +197 -481
- data/lib/active_record/gem_version.rb +3 -3
- data/lib/active_record/inheritance.rb +53 -24
- data/lib/active_record/insert_all.rb +208 -0
- data/lib/active_record/integration.rb +67 -17
- data/lib/active_record/internal_metadata.rb +26 -9
- data/lib/active_record/legacy_yaml_adapter.rb +7 -3
- data/lib/active_record/locking/optimistic.rb +26 -22
- data/lib/active_record/locking/pessimistic.rb +9 -5
- data/lib/active_record/log_subscriber.rb +34 -35
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +77 -0
- data/lib/active_record/migration/command_recorder.rb +96 -44
- data/lib/active_record/migration/compatibility.rb +141 -64
- data/lib/active_record/migration/join_table.rb +0 -1
- data/lib/active_record/migration.rb +205 -156
- data/lib/active_record/model_schema.rb +148 -22
- data/lib/active_record/nested_attributes.rb +4 -7
- data/lib/active_record/no_touching.rb +8 -1
- data/lib/active_record/null_relation.rb +0 -1
- data/lib/active_record/persistence.rb +267 -59
- data/lib/active_record/query_cache.rb +21 -4
- data/lib/active_record/querying.rb +40 -23
- data/lib/active_record/railtie.rb +115 -58
- data/lib/active_record/railties/controller_runtime.rb +30 -35
- data/lib/active_record/railties/databases.rake +402 -78
- data/lib/active_record/readonly_attributes.rb +4 -0
- data/lib/active_record/reflection.rb +113 -101
- data/lib/active_record/relation/batches/batch_enumerator.rb +25 -9
- data/lib/active_record/relation/batches.rb +44 -35
- data/lib/active_record/relation/calculations.rb +157 -93
- data/lib/active_record/relation/delegation.rb +35 -50
- data/lib/active_record/relation/finder_methods.rb +65 -40
- data/lib/active_record/relation/from_clause.rb +5 -1
- data/lib/active_record/relation/merger.rb +32 -40
- data/lib/active_record/relation/predicate_builder/array_handler.rb +13 -13
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +5 -9
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +4 -7
- data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +58 -40
- data/lib/active_record/relation/query_attribute.rb +13 -8
- data/lib/active_record/relation/query_methods.rb +487 -199
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +9 -9
- data/lib/active_record/relation/where_clause.rb +108 -58
- data/lib/active_record/relation.rb +375 -104
- data/lib/active_record/result.rb +64 -38
- data/lib/active_record/runtime_registry.rb +2 -2
- data/lib/active_record/sanitization.rb +22 -41
- data/lib/active_record/schema.rb +2 -11
- data/lib/active_record/schema_dumper.rb +54 -9
- data/lib/active_record/schema_migration.rb +7 -9
- data/lib/active_record/scoping/default.rb +6 -8
- data/lib/active_record/scoping/named.rb +17 -24
- data/lib/active_record/scoping.rb +8 -9
- 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 +51 -8
- data/lib/active_record/store.rb +88 -9
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +39 -43
- data/lib/active_record/tasks/database_tasks.rb +276 -81
- data/lib/active_record/tasks/mysql_database_tasks.rb +37 -39
- data/lib/active_record/tasks/postgresql_database_tasks.rb +27 -32
- data/lib/active_record/tasks/sqlite_database_tasks.rb +14 -17
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +246 -0
- data/lib/active_record/timestamp.rb +43 -32
- data/lib/active_record/touch_later.rb +23 -22
- data/lib/active_record/transactions.rb +59 -117
- data/lib/active_record/translation.rb +1 -1
- data/lib/active_record/type/adapter_specific_registry.rb +3 -13
- 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 +10 -5
- data/lib/active_record/type_caster/connection.rb +15 -15
- data/lib/active_record/type_caster/map.rb +8 -8
- 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 +38 -30
- data/lib/active_record/validations.rb +4 -3
- data/lib/active_record.rb +13 -12
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +41 -0
- data/lib/arel/collectors/bind.rb +29 -0
- data/lib/arel/collectors/composite.rb +39 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +42 -0
- data/lib/arel/delete_manager.rb +18 -0
- data/lib/arel/errors.rb +9 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +49 -0
- data/lib/arel/insert_manager.rb +49 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +126 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/delete_statement.rb +45 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +44 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +72 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/node.rb +51 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +19 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +31 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +41 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +70 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +250 -0
- data/lib/arel/select_manager.rb +270 -0
- data/lib/arel/table.rb +118 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors/dot.rb +308 -0
- data/lib/arel/visitors/mysql.rb +93 -0
- data/lib/arel/visitors/postgresql.rb +120 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +899 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +54 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -5
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +3 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +7 -5
- data/lib/rails/generators/active_record/migration.rb +19 -2
- 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
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
- metadata +117 -32
- data/lib/active_record/attribute_decorators.rb +0 -90
- data/lib/active_record/collection_cache_key.rb +0 -53
- data/lib/active_record/connection_adapters/connection_specification.rb +0 -287
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +0 -33
- data/lib/active_record/define_callbacks.rb +0 -22
- data/lib/active_record/relation/predicate_builder/base_handler.rb +0 -19
- data/lib/active_record/relation/where_clause_factory.rb +0 -34
data/CHANGELOG.md
CHANGED
@@ -1,937 +1,1303 @@
|
|
1
|
-
## Rails
|
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
|
-
Fixes #
|
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
|
-
Fixes #
|
15
|
+
Fixes #35204.
|
16
16
|
|
17
|
-
*
|
17
|
+
*Tomoyuki Kai*
|
18
18
|
|
19
|
-
*
|
19
|
+
* Build predicate conditions with objects that delegate `#id` and primary key:
|
20
20
|
|
21
|
-
|
21
|
+
```ruby
|
22
|
+
class AdminAuthor
|
23
|
+
delegate_missing_to :@author
|
22
24
|
|
23
|
-
|
25
|
+
def initialize(author)
|
26
|
+
@author = author
|
27
|
+
end
|
28
|
+
end
|
24
29
|
|
25
|
-
|
30
|
+
Post.where(author: AdminAuthor.new(author))
|
31
|
+
```
|
26
32
|
|
27
|
-
*
|
33
|
+
*Sean Doyle*
|
28
34
|
|
29
|
-
*
|
35
|
+
* Add `connected_to_many` API.
|
30
36
|
|
31
|
-
|
37
|
+
This API allows applications to connect to multiple databases at once without switching all of them or implementing a deeply nested stack.
|
32
38
|
|
33
|
-
|
39
|
+
Before:
|
34
40
|
|
35
|
-
|
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
|
36
48
|
|
49
|
+
After:
|
37
50
|
|
38
|
-
|
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
|
39
56
|
|
40
|
-
*
|
57
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
41
58
|
|
59
|
+
* Add option to raise or log for `ActiveRecord::StrictLoadingViolationError`.
|
42
60
|
|
43
|
-
|
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.
|
44
62
|
|
45
|
-
|
63
|
+
Set `config.active_record.action_on_strict_loading_violation` to `:log` errors instead of raising.
|
46
64
|
|
47
|
-
*
|
65
|
+
*Eileen M. Uchitelle*
|
48
66
|
|
49
|
-
* Allow
|
67
|
+
* Allow the inverse of a `has_one` association that was previously autosaved to be loaded.
|
50
68
|
|
51
|
-
|
69
|
+
Fixes #34255.
|
52
70
|
|
53
|
-
*
|
71
|
+
*Steven Weber*
|
54
72
|
|
55
|
-
|
56
|
-
adapter.
|
73
|
+
* Optimise the length of index names for polymorphic references by using the reference name rather than the type and id column names.
|
57
74
|
|
58
|
-
|
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.
|
59
76
|
|
60
|
-
|
77
|
+
This change reduces the chance of that happening by using the reference name, e.g. `index_my_table_on_my_reference`.
|
61
78
|
|
62
|
-
|
63
|
-
was passing for SQLite and MySQL, but failed for PostgreSQL:
|
79
|
+
Fixes #38655.
|
64
80
|
|
65
|
-
|
66
|
-
class DeveloperName < ActiveRecord::Type::String
|
67
|
-
def deserialize(value)
|
68
|
-
"Developer: #{value}"
|
69
|
-
end
|
70
|
-
end
|
81
|
+
*Luke Redpath*
|
71
82
|
|
72
|
-
|
73
|
-
|
83
|
+
* MySQL: Uniqueness validator now respects default database collation,
|
84
|
+
no longer enforce case sensitive comparison by default.
|
74
85
|
|
75
|
-
|
86
|
+
*Ryuta Kamizono*
|
76
87
|
|
77
|
-
|
78
|
-
end
|
88
|
+
* Remove deprecated methods from `ActiveRecord::ConnectionAdapters::DatabaseLimits`.
|
79
89
|
|
80
|
-
|
81
|
-
|
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`
|
82
97
|
|
83
|
-
|
84
|
-
puts loaded_developer.name # should be "Developer: name" but it's just "name"
|
85
|
-
```
|
98
|
+
*Rafael Mendonça França*
|
86
99
|
|
87
|
-
|
100
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_multi_insert?`.
|
88
101
|
|
89
|
-
*
|
102
|
+
*Rafael Mendonça França*
|
90
103
|
|
91
|
-
|
104
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::AbstractAdapter#supports_foreign_keys_in_create?`.
|
92
105
|
|
93
|
-
*
|
94
|
-
if the attribute does not exist.
|
106
|
+
*Rafael Mendonça França*
|
95
107
|
|
96
|
-
|
108
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#supports_ranges?`.
|
97
109
|
|
98
|
-
*
|
110
|
+
*Rafael Mendonça França*
|
99
111
|
|
100
|
-
|
112
|
+
* Remove deprecated `ActiveRecord::Base#update_attributes` and `ActiveRecord::Base#update_attributes!`.
|
101
113
|
|
102
|
-
*
|
114
|
+
*Rafael Mendonça França*
|
103
115
|
|
104
|
-
|
116
|
+
* Remove deprecated `migrations_path` argument in `ActiveRecord::ConnectionAdapter::SchemaStatements#assume_migrated_upto_version`.
|
117
|
+
|
118
|
+
*Rafael Mendonça França*
|
105
119
|
|
106
|
-
*
|
120
|
+
* Remove deprecated `config.active_record.sqlite3.represent_boolean_as_integer`.
|
107
121
|
|
108
|
-
|
122
|
+
*Rafael Mendonça França*
|
109
123
|
|
110
|
-
|
124
|
+
* `relation.create` does no longer leak scope to class level querying methods
|
125
|
+
in initialization block and callbacks.
|
111
126
|
|
112
|
-
|
127
|
+
Before:
|
113
128
|
|
114
|
-
|
129
|
+
User.where(name: "John").create do |john|
|
130
|
+
User.find_by(name: "David") # => nil
|
131
|
+
end
|
115
132
|
|
116
|
-
|
133
|
+
After:
|
117
134
|
|
118
|
-
|
135
|
+
User.where(name: "John").create do |john|
|
136
|
+
User.find_by(name: "David") # => #<User name: "David", ...>
|
137
|
+
end
|
119
138
|
|
120
|
-
*
|
139
|
+
*Ryuta Kamizono*
|
121
140
|
|
122
|
-
|
141
|
+
* Named scope chain does no longer leak scope to class level querying methods.
|
123
142
|
|
124
|
-
|
143
|
+
class User < ActiveRecord::Base
|
144
|
+
scope :david, -> { User.where(name: "David") }
|
145
|
+
end
|
125
146
|
|
126
|
-
|
147
|
+
Before:
|
127
148
|
|
128
|
-
|
149
|
+
User.where(name: "John").david
|
150
|
+
# SELECT * FROM users WHERE name = 'John' AND name = 'David'
|
129
151
|
|
130
|
-
|
152
|
+
After:
|
131
153
|
|
132
|
-
|
154
|
+
User.where(name: "John").david
|
155
|
+
# SELECT * FROM users WHERE name = 'David'
|
133
156
|
|
134
157
|
*Ryuta Kamizono*
|
135
158
|
|
136
|
-
*
|
159
|
+
* Remove deprecated methods from `ActiveRecord::DatabaseConfigurations`.
|
137
160
|
|
138
|
-
|
161
|
+
`fetch`
|
162
|
+
`each`
|
163
|
+
`first`
|
164
|
+
`values`
|
165
|
+
`[]=`
|
139
166
|
|
140
|
-
*
|
167
|
+
*Rafael Mendonça França*
|
141
168
|
|
142
|
-
|
169
|
+
* `where.not` now generates NAND predicates instead of NOR.
|
143
170
|
|
171
|
+
Before:
|
144
172
|
|
145
|
-
|
173
|
+
User.where.not(name: "Jon", role: "admin")
|
174
|
+
# SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
|
146
175
|
|
147
|
-
|
176
|
+
After:
|
148
177
|
|
178
|
+
User.where.not(name: "Jon", role: "admin")
|
179
|
+
# SELECT * FROM users WHERE NOT (name == 'Jon' AND role == 'admin')
|
149
180
|
|
150
|
-
|
181
|
+
*Rafael Mendonça França*
|
151
182
|
|
152
|
-
*
|
183
|
+
* Remove deprecated `ActiveRecord::Result#to_hash` method.
|
153
184
|
|
154
|
-
|
185
|
+
*Rafael Mendonça França*
|
155
186
|
|
156
|
-
|
187
|
+
* Deprecate `ActiveRecord::Base.allow_unsafe_raw_sql`.
|
157
188
|
|
158
|
-
*
|
189
|
+
*Rafael Mendonça França*
|
159
190
|
|
160
|
-
|
191
|
+
* Remove deprecated support for using unsafe raw SQL in `ActiveRecord::Relation` methods.
|
161
192
|
|
162
|
-
*
|
193
|
+
*Rafael Mendonça França*
|
163
194
|
|
164
|
-
|
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`.
|
165
197
|
|
166
|
-
*
|
198
|
+
*Omri Gabay*
|
167
199
|
|
168
|
-
|
200
|
+
* Connections can be granularly switched for abstract classes when `connected_to` is called.
|
169
201
|
|
170
|
-
|
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.
|
171
203
|
|
172
|
-
|
204
|
+
Example usage:
|
173
205
|
|
174
|
-
|
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`.
|
175
207
|
|
176
|
-
|
208
|
+
```ruby
|
209
|
+
ActiveRecord::Base.connected_to(role: :reading) do
|
210
|
+
User.first # reads from default replica
|
211
|
+
Dog.first # reads from default replica
|
177
212
|
|
178
|
-
|
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
|
179
217
|
|
180
|
-
|
218
|
+
User.first # reads from default replica
|
219
|
+
Dog.first # reads from default replica
|
181
220
|
|
182
|
-
|
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
|
226
|
+
```
|
183
227
|
|
184
|
-
*
|
228
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
185
229
|
|
186
|
-
*
|
230
|
+
* Allow double-dash comment syntax when querying read-only databases
|
187
231
|
|
188
|
-
|
232
|
+
*James Adam*
|
189
233
|
|
190
|
-
|
234
|
+
* Add `values_at` method.
|
191
235
|
|
192
|
-
|
236
|
+
Returns an array containing the values associated with the given methods.
|
193
237
|
|
194
|
-
|
238
|
+
```ruby
|
239
|
+
topic = Topic.first
|
240
|
+
topic.values_at(:title, :author_name)
|
241
|
+
# => ["Budget", "Jason"]
|
242
|
+
```
|
195
243
|
|
196
|
-
|
244
|
+
Similar to `Hash#values_at` but on an Active Record instance.
|
197
245
|
|
198
|
-
*
|
246
|
+
*Guillaume Briday*
|
199
247
|
|
200
|
-
|
248
|
+
* Fix `read_attribute_before_type_cast` to consider attribute aliases.
|
201
249
|
|
202
|
-
*
|
203
|
-
wrongly persists through record.
|
250
|
+
*Marcelo Lauxen*
|
204
251
|
|
205
|
-
|
252
|
+
* Support passing record to uniqueness validator `:conditions` callable:
|
206
253
|
|
207
|
-
|
254
|
+
```ruby
|
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
|
+
```
|
208
262
|
|
209
|
-
*
|
210
|
-
query cache.
|
263
|
+
*Eliot Sykes*
|
211
264
|
|
212
|
-
|
265
|
+
* `BatchEnumerator#update_all` and `BatchEnumerator#delete_all` now return the
|
266
|
+
total number of rows affected, just like their non-batched counterparts.
|
213
267
|
|
268
|
+
```ruby
|
269
|
+
Person.in_batches.update_all("first_name = 'Eugene'") # => 42
|
270
|
+
Person.in_batches.delete_all # => 42
|
271
|
+
```
|
214
272
|
|
215
|
-
|
273
|
+
Fixes #40287.
|
216
274
|
|
217
|
-
*
|
275
|
+
*Eugene Kenny*
|
218
276
|
|
219
|
-
|
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.
|
220
282
|
|
221
|
-
|
283
|
+
To use this in 6.1, you need to place the next string to your model file:
|
222
284
|
|
223
|
-
|
224
|
-
have a specified precision then on assignment the value is rounded to
|
225
|
-
that precision. This behavior is now applied to time columns as well.
|
285
|
+
attribute :duration, :interval
|
226
286
|
|
227
|
-
|
287
|
+
To keep old behavior until 6.2 is released:
|
228
288
|
|
229
|
-
|
289
|
+
attribute :duration, :string
|
230
290
|
|
231
|
-
|
291
|
+
Example:
|
232
292
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
293
|
+
create_table :events do |t|
|
294
|
+
t.string :name
|
295
|
+
t.interval :duration
|
296
|
+
end
|
237
297
|
|
238
|
-
|
298
|
+
class Event < ApplicationRecord
|
299
|
+
attribute :duration, :interval
|
300
|
+
end
|
239
301
|
|
240
|
-
|
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
|
241
307
|
|
242
|
-
|
243
|
-
was removed however it only removed it when it was 2001-01-01. Now the
|
244
|
-
date component is removed irrespective of what the date is.
|
308
|
+
*Andrey Novikov*
|
245
309
|
|
246
|
-
|
310
|
+
* Allow associations supporting the `dependent:` key to take `dependent: :destroy_async`.
|
247
311
|
|
248
|
-
|
249
|
-
|
312
|
+
```ruby
|
313
|
+
class Account < ActiveRecord::Base
|
314
|
+
belongs_to :supplier, dependent: :destroy_async
|
315
|
+
end
|
316
|
+
```
|
250
317
|
|
251
|
-
|
318
|
+
`:destroy_async` will enqueue a job to destroy associated records in the background.
|
252
319
|
|
253
|
-
*
|
320
|
+
*DHH*, *George Claghorn*, *Cory Gwin*, *Rafael Mendonça França*, *Adrianna Chang*
|
254
321
|
|
255
|
-
*
|
322
|
+
* Add `SKIP_TEST_DATABASE` environment variable to disable modifying the test database when `rails db:create` and `rails db:drop` are called.
|
256
323
|
|
257
|
-
*
|
324
|
+
*Jason Schweier*
|
258
325
|
|
259
|
-
*
|
326
|
+
* `connects_to` can only be called on `ActiveRecord::Base` or abstract classes.
|
260
327
|
|
261
|
-
|
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.
|
329
|
+
|
330
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
331
|
+
|
332
|
+
* All connection adapters `execute` now raises `ActiveRecord::ConnectionNotEstablished` rather than
|
333
|
+
`ActiveRecord::StatementInvalid` when they encounter a connection error.
|
334
|
+
|
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.
|
262
339
|
|
263
|
-
*
|
264
|
-
`ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
|
265
|
-
even if `ORDER BY` columns include other table's primary key.
|
340
|
+
*Jean Boussier*
|
266
341
|
|
267
|
-
|
342
|
+
* Add support for check constraints that are `NOT VALID` via `validate: false` (PostgreSQL-only).
|
268
343
|
|
269
|
-
*
|
344
|
+
*Alex Robbin*
|
270
345
|
|
271
|
-
*
|
346
|
+
* Ensure the default configuration is considered primary or first for an environment
|
272
347
|
|
273
|
-
|
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.
|
353
|
+
|
354
|
+
```ruby
|
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")
|
362
|
+
```
|
274
363
|
|
275
364
|
*Ryuta Kamizono*
|
276
365
|
|
277
|
-
*
|
366
|
+
* Support storing demodulized class name for polymorphic type.
|
278
367
|
|
279
|
-
|
368
|
+
Before Rails 6.1, storing demodulized class name is supported only for STI type
|
369
|
+
by `store_full_sti_class` class attribute.
|
280
370
|
|
281
|
-
|
282
|
-
Using a `Relation` for performing queries is the prefered API.
|
371
|
+
Now `store_full_class_name` class attribute can handle both STI and polymorphic types.
|
283
372
|
|
284
373
|
*Ryuta Kamizono*
|
285
374
|
|
286
|
-
*
|
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.
|
287
378
|
|
288
|
-
|
289
|
-
|
290
|
-
|
379
|
+
*fatkodima*
|
380
|
+
|
381
|
+
* Respect the `select` values for eager loading.
|
291
382
|
|
292
|
-
|
293
|
-
|
383
|
+
```ruby
|
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
|
294
397
|
```
|
295
398
|
|
296
|
-
|
399
|
+
*Ryuta Kamizono*
|
400
|
+
|
401
|
+
* Allow attribute's default to be configured but keeping its own type.
|
297
402
|
|
298
|
-
|
403
|
+
```ruby
|
404
|
+
class Post < ActiveRecord::Base
|
405
|
+
attribute :written_at, default: -> { Time.now.utc }
|
406
|
+
end
|
299
407
|
|
300
|
-
|
408
|
+
# Rails 6.0
|
409
|
+
Post.type_for_attribute(:written_at) # => #<Type::Value ... precision: nil, ...>
|
301
410
|
|
302
|
-
|
411
|
+
# Rails 6.1
|
412
|
+
Post.type_for_attribute(:written_at) # => #<Type::DateTime ... precision: 6, ...>
|
413
|
+
```
|
303
414
|
|
304
415
|
*Ryuta Kamizono*
|
305
416
|
|
306
|
-
*
|
417
|
+
* Allow default to be configured for Enum.
|
307
418
|
|
308
|
-
|
419
|
+
```ruby
|
420
|
+
class Book < ActiveRecord::Base
|
421
|
+
enum status: [:proposed, :written, :published], _default: :published
|
422
|
+
end
|
309
423
|
|
310
|
-
|
424
|
+
Book.new.status # => "published"
|
425
|
+
```
|
311
426
|
|
312
|
-
*
|
427
|
+
*Ryuta Kamizono*
|
313
428
|
|
314
|
-
|
429
|
+
* Deprecate YAML loading from legacy format older than Rails 5.0.
|
315
430
|
|
316
|
-
*
|
431
|
+
*Ryuta Kamizono*
|
317
432
|
|
318
|
-
|
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.
|
319
437
|
|
320
|
-
*
|
438
|
+
*Sean Griffin*, *Ryuta Kamizono*
|
439
|
+
|
440
|
+
* Deprecate `map!` and `collect!` on `ActiveRecord::Result`.
|
321
441
|
|
322
442
|
*Ryuta Kamizono*
|
323
443
|
|
324
|
-
*
|
444
|
+
* Support `relation.and` for intersection as Set theory.
|
325
445
|
|
326
|
-
|
446
|
+
```ruby
|
447
|
+
david_and_mary = Author.where(id: [david, mary])
|
448
|
+
mary_and_bob = Author.where(id: [mary, bob])
|
327
449
|
|
328
|
-
|
450
|
+
david_and_mary.merge(mary_and_bob) # => [mary, bob]
|
329
451
|
|
330
|
-
|
452
|
+
david_and_mary.and(mary_and_bob) # => [mary]
|
453
|
+
david_and_mary.or(mary_and_bob) # => [david, mary, bob]
|
454
|
+
```
|
331
455
|
|
332
|
-
|
456
|
+
*Ryuta Kamizono*
|
333
457
|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
has_many :subscriptions, through: :books
|
338
|
-
end
|
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)`.
|
339
461
|
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
has_many :subscriptions, through: :books
|
344
|
-
end
|
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]
|
345
465
|
|
346
|
-
|
347
|
-
|
348
|
-
has_many :subscriptions
|
349
|
-
end
|
466
|
+
# Rails 6.1 (both conflict conditions exists, deprecated)
|
467
|
+
Author.where(id: david.id..mary.id).merge(Author.where(id: bob)) # => []
|
350
468
|
|
351
|
-
|
352
|
-
|
353
|
-
end
|
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]
|
354
471
|
|
355
|
-
|
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
|
+
```
|
356
476
|
|
357
|
-
|
477
|
+
*Ryuta Kamizono*
|
358
478
|
|
359
|
-
|
479
|
+
* Do not mark Postgresql MAC address and UUID attributes as changed when the assigned value only varies by case.
|
360
480
|
|
361
|
-
|
362
|
-
just like it would if `post` were persisted.
|
481
|
+
*Peter Fry*
|
363
482
|
|
364
|
-
|
483
|
+
* Resolve issue with insert_all unique_by option when used with expression index.
|
365
484
|
|
366
|
-
|
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.
|
367
488
|
|
368
|
-
|
369
|
-
The `first(n)` finder now respects the `limit()`, making it consistent
|
370
|
-
with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
|
489
|
+
Usage:
|
371
490
|
|
372
|
-
|
491
|
+
```ruby
|
492
|
+
create_table :books, id: :integer, force: true do |t|
|
493
|
+
t.column :name, :string
|
494
|
+
t.index "lower(name)", unique: true
|
495
|
+
end
|
373
496
|
|
374
|
-
|
497
|
+
Book.insert_all [{ name: "MyTest" }], unique_by: :index_books_on_lower_name
|
498
|
+
```
|
375
499
|
|
376
|
-
|
377
|
-
SQL queries for association counting.
|
500
|
+
Fixes #39516.
|
378
501
|
|
379
|
-
*
|
502
|
+
*Austen Madden*
|
380
503
|
|
381
|
-
*
|
504
|
+
* Add basic support for CHECK constraints to database migrations.
|
382
505
|
|
383
|
-
|
506
|
+
Usage:
|
384
507
|
|
385
|
-
|
508
|
+
```ruby
|
509
|
+
add_check_constraint :products, "price > 0", name: "price_check"
|
510
|
+
remove_check_constraint :products, name: "price_check"
|
511
|
+
```
|
386
512
|
|
387
|
-
*
|
513
|
+
*fatkodima*
|
388
514
|
|
389
|
-
*
|
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.
|
390
518
|
|
391
|
-
|
519
|
+
Usage:
|
392
520
|
|
393
|
-
|
394
|
-
|
521
|
+
```ruby
|
522
|
+
class Developer < ApplicationRecord
|
523
|
+
self.strict_loading_by_default = true
|
395
524
|
|
396
|
-
|
525
|
+
has_many :projects
|
526
|
+
end
|
397
527
|
|
398
|
-
|
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
|
+
```
|
399
532
|
|
400
|
-
|
401
|
-
of database queries in the log to facilitate N+1 query resolution
|
402
|
-
and other debugging.
|
533
|
+
*bogdanvlviv*
|
403
534
|
|
404
|
-
|
405
|
-
recommended for use in the production environment since it relies
|
406
|
-
on Ruby's `Kernel#caller_locations` which is fairly slow.
|
535
|
+
* Deprecate passing an Active Record object to `quote`/`type_cast` directly.
|
407
536
|
|
408
|
-
*
|
537
|
+
*Ryuta Kamizono*
|
409
538
|
|
410
|
-
*
|
539
|
+
* Default engine `ENGINE=InnoDB` is no longer dumped to make schema more agnostic.
|
411
540
|
|
412
|
-
|
413
|
-
# create_table :posts do |t|
|
414
|
-
# t.integer :comments_count, default: 0
|
415
|
-
# t.integer :lock_version
|
416
|
-
# t.timestamps
|
417
|
-
# end
|
418
|
-
class Post < ApplicationRecord
|
419
|
-
end
|
541
|
+
Before:
|
420
542
|
|
421
|
-
|
422
|
-
|
423
|
-
# end
|
424
|
-
class Comment < ApplicationRecord
|
425
|
-
belongs_to :post, touch: true, counter_cache: true
|
543
|
+
```ruby
|
544
|
+
create_table "accounts", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
|
426
545
|
end
|
427
546
|
```
|
428
547
|
|
429
|
-
|
548
|
+
After:
|
549
|
+
|
550
|
+
```ruby
|
551
|
+
create_table "accounts", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
|
552
|
+
end
|
430
553
|
```
|
431
|
-
post = Post.create!
|
432
|
-
# => begin transaction
|
433
|
-
INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
|
434
|
-
VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
|
435
|
-
commit transaction
|
436
554
|
|
437
|
-
|
438
|
-
# => begin transaction
|
439
|
-
INSERT INTO "comments" ("post_id") VALUES (1)
|
555
|
+
*Ryuta Kamizono*
|
440
556
|
|
441
|
-
|
442
|
-
|
557
|
+
* Added delegated type as an alternative to single-table inheritance for representing class hierarchies.
|
558
|
+
See ActiveRecord::DelegatedType for the full description.
|
443
559
|
|
444
|
-
|
445
|
-
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
446
|
-
rollback transaction
|
447
|
-
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
560
|
+
*DHH*
|
448
561
|
|
449
|
-
|
450
|
-
# => begin transaction
|
451
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
562
|
+
* Deprecate aggregations with group by duplicated fields.
|
452
563
|
|
453
|
-
|
454
|
-
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
564
|
+
To migrate to Rails 6.2's behavior, use `uniq!(:group)` to deduplicate group fields.
|
455
565
|
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
#
|
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
|
+
# }
|
460
582
|
```
|
461
583
|
|
462
|
-
|
463
|
-
```
|
464
|
-
post = Post.create!
|
465
|
-
# => begin transaction
|
466
|
-
INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
|
467
|
-
VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
|
468
|
-
commit transaction
|
584
|
+
*Ryuta Kamizono*
|
469
585
|
|
470
|
-
|
471
|
-
# => begin transaction
|
472
|
-
INSERT INTO "comments" ("post_id") VALUES (1)
|
586
|
+
* Deprecate duplicated query annotations.
|
473
587
|
|
474
|
-
|
475
|
-
"lock_version" = COALESCE("lock_version", 0) + 1,
|
476
|
-
"updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
|
477
|
-
commit transaction
|
588
|
+
To migrate to Rails 6.2's behavior, use `uniq!(:annotate)` to deduplicate query annotations.
|
478
589
|
|
479
|
-
|
480
|
-
|
481
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
590
|
+
```ruby
|
591
|
+
accounts = Account.where(id: [1, 2]).annotate("david and mary")
|
482
592
|
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
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 */
|
596
|
+
|
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 */
|
487
600
|
```
|
488
601
|
|
489
|
-
|
602
|
+
*Ryuta Kamizono*
|
490
603
|
|
491
|
-
|
604
|
+
* Resolve conflict between counter cache and optimistic locking.
|
492
605
|
|
493
|
-
|
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.
|
494
610
|
|
495
|
-
|
611
|
+
Fixes #16449.
|
496
612
|
|
497
|
-
|
613
|
+
*Aaron Lipman*
|
498
614
|
|
499
|
-
|
615
|
+
* Support merging option `:rewhere` to allow mergee side condition to be replaced exactly.
|
500
616
|
|
501
|
-
|
617
|
+
```ruby
|
618
|
+
david_and_mary = Author.where(id: david.id..mary.id)
|
502
619
|
|
503
|
-
|
620
|
+
# both conflict conditions exists
|
621
|
+
david_and_mary.merge(Author.where(id: bob)) # => []
|
504
622
|
|
505
|
-
|
623
|
+
# mergee side condition is replaced by rewhere
|
624
|
+
david_and_mary.merge(Author.rewhere(id: bob)) # => [bob]
|
506
625
|
|
507
|
-
|
508
|
-
|
626
|
+
# mergee side condition is replaced by rewhere option
|
627
|
+
david_and_mary.merge(Author.where(id: bob), rewhere: true) # => [bob]
|
628
|
+
```
|
509
629
|
|
510
630
|
*Ryuta Kamizono*
|
511
631
|
|
512
|
-
* Add
|
513
|
-
|
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.
|
514
636
|
|
515
|
-
|
637
|
+
```ruby
|
638
|
+
signed_id = User.first.signed_id expires_in: 15.minutes, purpose: :password_reset
|
516
639
|
|
517
|
-
|
518
|
-
relation query methods.
|
640
|
+
User.find_signed signed_id # => nil, since the purpose does not match
|
519
641
|
|
520
|
-
|
521
|
-
|
522
|
-
Article.order("LENGTH(title)")
|
523
|
-
```
|
642
|
+
travel 16.minutes
|
643
|
+
User.find_signed signed_id, purpose: :password_reset # => nil, since the signed id has expired
|
524
644
|
|
525
|
-
|
645
|
+
travel_back
|
646
|
+
User.find_signed signed_id, purpose: :password_reset # => User.first
|
647
|
+
|
648
|
+
User.find_signed! "bad data" # => ActiveSupport::MessageVerifier::InvalidSignature
|
526
649
|
```
|
527
|
-
|
650
|
+
|
651
|
+
*DHH*
|
652
|
+
|
653
|
+
* Support `ALGORITHM = INSTANT` DDL option for index operations on MySQL.
|
654
|
+
|
655
|
+
*Ryuta Kamizono*
|
656
|
+
|
657
|
+
* Fix index creation to preserve index comment in bulk change table on MySQL.
|
658
|
+
|
659
|
+
*Ryuta Kamizono*
|
660
|
+
|
661
|
+
* Allow `unscope` to be aware of table name qualified values.
|
662
|
+
|
663
|
+
It is possible to unscope only the column in the specified table.
|
664
|
+
|
665
|
+
```ruby
|
666
|
+
posts = Post.joins(:comments).group(:"posts.hidden")
|
667
|
+
posts = posts.where("posts.hidden": false, "comments.hidden": false)
|
668
|
+
|
669
|
+
posts.count
|
670
|
+
# => { false => 10 }
|
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 }
|
528
679
|
```
|
529
680
|
|
530
|
-
|
531
|
-
|
532
|
-
|
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")
|
533
688
|
|
534
|
-
|
535
|
-
become an UnknownAttributeReference error in Rails 6.0. Applications
|
536
|
-
can opt in to the future behavior by setting `allow_unsafe_raw_sql`
|
537
|
-
to `:disabled`.
|
689
|
+
relation = Essay.where(writer: steve)
|
538
690
|
|
539
|
-
|
540
|
-
|
691
|
+
# Before
|
692
|
+
relation.rewhere(writer: david).to_a # => []
|
693
|
+
|
694
|
+
# After
|
695
|
+
relation.rewhere(writer: david).to_a # => [david]
|
541
696
|
```
|
542
|
-
|
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">
|
543
705
|
```
|
544
706
|
|
545
|
-
*
|
707
|
+
*akinomaeni*, *Jonathan Hefner*
|
546
708
|
|
547
|
-
*
|
548
|
-
`Type#serialize`. This means that `update_all(foo: 'true')` will properly
|
549
|
-
persist a boolean.
|
709
|
+
* Deprecate passing a column to `type_cast`.
|
550
710
|
|
551
|
-
*
|
711
|
+
*Ryuta Kamizono*
|
552
712
|
|
553
|
-
*
|
554
|
-
when statement timeout exceeded.
|
713
|
+
* Deprecate `in_clause_length` and `allowed_index_name_length` in `DatabaseLimits`.
|
555
714
|
|
556
715
|
*Ryuta Kamizono*
|
557
716
|
|
558
|
-
*
|
559
|
-
`bin/rails db:migrate` with empty VERSION behaves as without `VERSION`.
|
560
|
-
Check a format of `VERSION`: Allow a migration version number
|
561
|
-
or name of a migration file. Raise error if format of `VERSION` is invalid.
|
562
|
-
Raise error if target migration doesn't exist.
|
717
|
+
* Support bulk insert/upsert on relation to preserve scope values.
|
563
718
|
|
564
|
-
*
|
719
|
+
*Josef Šimánek*, *Ryuta Kamizono*
|
565
720
|
|
566
|
-
*
|
567
|
-
`db/schema.rb` when using the sqlite adapter.
|
721
|
+
* Preserve column comment value on changing column name on MySQL.
|
568
722
|
|
569
|
-
|
723
|
+
*Islam Taha*
|
570
724
|
|
571
|
-
|
725
|
+
* Add support for `if_exists` option for removing an index.
|
572
726
|
|
573
|
-
|
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.
|
574
728
|
|
575
|
-
*
|
729
|
+
*Eileen M. Uchitelle*
|
576
730
|
|
577
|
-
* Remove
|
731
|
+
* Remove ibm_db, informix, mssql, oracle, and oracle12 Arel visitors which are not used in the code base.
|
578
732
|
|
579
|
-
*
|
733
|
+
*Ryuta Kamizono*
|
580
734
|
|
581
|
-
*
|
735
|
+
* Prevent `build_association` from `touching` a parent record if the record isn't persisted for `has_one` associations.
|
582
736
|
|
583
|
-
|
737
|
+
Fixes #38219.
|
584
738
|
|
585
|
-
*
|
739
|
+
*Josh Brody*
|
586
740
|
|
587
|
-
|
741
|
+
* Add support for `if_not_exists` option for adding index.
|
588
742
|
|
589
|
-
|
743
|
+
The `add_index` method respects `if_not_exists` option. If it is set to true
|
744
|
+
index won't be added.
|
590
745
|
|
591
|
-
|
746
|
+
Usage:
|
592
747
|
|
593
|
-
|
748
|
+
```ruby
|
749
|
+
add_index :users, :account_id, if_not_exists: true
|
750
|
+
```
|
594
751
|
|
595
|
-
|
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.
|
596
755
|
|
597
|
-
*
|
756
|
+
*Prathamesh Sonpatki*
|
598
757
|
|
599
|
-
|
758
|
+
* Add `ActiveRecord::Base#previously_new_record?` to show if a record was new before the last save.
|
600
759
|
|
601
|
-
*
|
760
|
+
*Tom Ward*
|
602
761
|
|
603
|
-
|
762
|
+
* Support descending order for `find_each`, `find_in_batches`, and `in_batches`.
|
604
763
|
|
605
|
-
|
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.
|
606
765
|
|
607
|
-
|
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.
|
608
767
|
|
609
|
-
|
768
|
+
Pass `order: :desc` to yield batches in descending order. The default remains `order: :asc`.
|
610
769
|
|
611
|
-
|
770
|
+
```ruby
|
771
|
+
Person.find_each(order: :desc) do |person|
|
772
|
+
person.party_all_night!
|
773
|
+
end
|
774
|
+
```
|
612
775
|
|
613
|
-
*
|
776
|
+
*Alexey Vasiliev*
|
614
777
|
|
615
|
-
|
778
|
+
* Fix `insert_all` with enum values.
|
616
779
|
|
617
|
-
|
780
|
+
Fixes #38716.
|
618
781
|
|
619
|
-
*
|
782
|
+
*Joel Blum*
|
620
783
|
|
621
|
-
*
|
784
|
+
* Add support for `db:rollback:name` for multiple database applications.
|
622
785
|
|
623
|
-
|
786
|
+
Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
|
624
787
|
|
625
|
-
*
|
626
|
-
ar_internal_metadata's data for a test database.
|
788
|
+
*Eileen M. Uchitelle*
|
627
789
|
|
628
|
-
|
790
|
+
* `Relation#pick` now uses already loaded results instead of making another query.
|
791
|
+
|
792
|
+
*Eugene Kenny*
|
793
|
+
|
794
|
+
* Deprecate using `return`, `break` or `throw` to exit a transaction block after writes.
|
795
|
+
|
796
|
+
*Dylan Thacker-Smith*
|
797
|
+
|
798
|
+
* Dump the schema or structure of a database when calling `db:migrate:name`.
|
799
|
+
|
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.
|
801
|
+
|
802
|
+
Going forward, calls to `rails db:migrate:name` will dump the schema (or structure) of the database being migrated.
|
803
|
+
|
804
|
+
*Kyle Thompson*
|
805
|
+
|
806
|
+
* Reset the `ActiveRecord::Base` connection after `rails db:migrate:name`.
|
807
|
+
|
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.
|
809
|
+
|
810
|
+
*Kyle Thompson*
|
811
|
+
|
812
|
+
* Disallow calling `connected_to` on subclasses of `ActiveRecord::Base`.
|
813
|
+
|
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.
|
815
|
+
|
816
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
817
|
+
|
818
|
+
* Add support for horizontal sharding to `connects_to` and `connected_to`.
|
819
|
+
|
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.
|
821
|
+
|
822
|
+
Usage:
|
823
|
+
|
824
|
+
Given the following configuration:
|
825
|
+
|
826
|
+
```yaml
|
827
|
+
# config/database.yml
|
828
|
+
production:
|
829
|
+
primary:
|
830
|
+
database: my_database
|
831
|
+
primary_shard_one:
|
832
|
+
database: my_database_shard_one
|
629
833
|
```
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
834
|
+
|
835
|
+
Connect to multiple shards:
|
836
|
+
|
837
|
+
```ruby
|
838
|
+
class ApplicationRecord < ActiveRecord::Base
|
839
|
+
self.abstract_class = true
|
840
|
+
|
841
|
+
connects_to shards: {
|
842
|
+
default: { writing: :primary },
|
843
|
+
shard_one: { writing: :primary_shard_one }
|
844
|
+
}
|
634
845
|
```
|
635
846
|
|
636
|
-
|
847
|
+
Swap between shards in your controller / model code:
|
848
|
+
|
849
|
+
```ruby
|
850
|
+
ActiveRecord::Base.connected_to(shard: :shard_one) do
|
851
|
+
# Read from shard one
|
852
|
+
end
|
637
853
|
```
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
854
|
+
|
855
|
+
The horizontal sharding API also supports read replicas. See guides for more details.
|
856
|
+
|
857
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
858
|
+
|
859
|
+
* Deprecate `spec_name` in favor of `name` on database configurations.
|
860
|
+
|
861
|
+
The accessors for `spec_name` on `configs_for` and `DatabaseConfig` are deprecated. Please use `name` instead.
|
862
|
+
|
863
|
+
Deprecated behavior:
|
864
|
+
|
865
|
+
```ruby
|
866
|
+
db_config = ActiveRecord::Base.configs_for(env_name: "development", spec_name: "primary")
|
867
|
+
db_config.spec_name
|
642
868
|
```
|
643
869
|
|
644
|
-
|
870
|
+
New behavior:
|
645
871
|
|
646
|
-
|
872
|
+
```ruby
|
873
|
+
db_config = ActiveRecord::Base.configs_for(env_name: "development", name: "primary")
|
874
|
+
db_config.name
|
875
|
+
```
|
647
876
|
|
648
|
-
*
|
877
|
+
*Eileen M. Uchitelle*
|
649
878
|
|
650
|
-
|
879
|
+
* Add additional database-specific rake tasks for multi-database users.
|
651
880
|
|
652
|
-
|
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:
|
653
883
|
|
654
|
-
|
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
|
894
|
+
```
|
655
895
|
|
656
|
-
|
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:
|
657
898
|
|
658
|
-
|
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
|
+
```
|
659
916
|
|
660
|
-
*
|
917
|
+
*Kyle Thompson*
|
661
918
|
|
662
|
-
|
919
|
+
* Add support for `strict_loading` mode on association declarations.
|
663
920
|
|
664
|
-
|
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.
|
665
922
|
|
666
|
-
|
923
|
+
Usage:
|
667
924
|
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
dropped in SQL commands:
|
925
|
+
```ruby
|
926
|
+
class Developer < ApplicationRecord
|
927
|
+
has_many :projects, strict_loading: true
|
928
|
+
end
|
673
929
|
|
674
|
-
|
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
|
+
```
|
675
934
|
|
676
|
-
|
677
|
-
# => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
|
935
|
+
*Kevin Deisz*
|
678
936
|
|
679
|
-
|
937
|
+
* Add support for `strict_loading` mode to prevent lazy loading of records.
|
680
938
|
|
681
|
-
|
682
|
-
# => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
|
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.
|
683
940
|
|
684
|
-
|
941
|
+
Usage:
|
685
942
|
|
686
|
-
|
687
|
-
|
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
|
+
```
|
688
948
|
|
689
|
-
*
|
949
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
690
950
|
|
691
|
-
*
|
951
|
+
* Add support for PostgreSQL 11+ partitioned indexes when using `upsert_all`.
|
692
952
|
|
693
|
-
|
953
|
+
*Sebastián Palma*
|
694
954
|
|
695
|
-
|
955
|
+
* Adds support for `if_not_exists` to `add_column` and `if_exists` to `remove_column`.
|
696
956
|
|
697
|
-
|
698
|
-
more descriptive.
|
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.
|
699
958
|
|
700
|
-
|
959
|
+
Example Usage:
|
701
960
|
|
702
|
-
|
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
|
967
|
+
```
|
703
968
|
|
704
|
-
|
705
|
-
|
969
|
+
```ruby
|
970
|
+
class RemoveColumnTitle < ActiveRecord::Migration[6.1]
|
971
|
+
def change
|
972
|
+
remove_column :posts, :title, if_exists: true
|
973
|
+
end
|
974
|
+
end
|
975
|
+
```
|
706
976
|
|
707
|
-
*
|
977
|
+
*Eileen M. Uchitelle*
|
708
978
|
|
709
|
-
*
|
979
|
+
* Regexp-escape table name for MS SQL Server.
|
710
980
|
|
711
|
-
|
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.
|
712
982
|
|
713
|
-
*
|
983
|
+
*Larry Reid*
|
714
984
|
|
715
|
-
|
985
|
+
* Store advisory locks on their own named connection.
|
716
986
|
|
717
|
-
|
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.
|
718
988
|
|
719
|
-
|
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.
|
720
990
|
|
721
|
-
*
|
991
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
722
992
|
|
723
|
-
*
|
993
|
+
* Allow schema cache path to be defined in the database configuration file.
|
724
994
|
|
725
|
-
|
995
|
+
For example:
|
726
996
|
|
727
|
-
|
997
|
+
```yaml
|
998
|
+
development:
|
999
|
+
adapter: postgresql
|
1000
|
+
database: blog_development
|
1001
|
+
pool: 5
|
1002
|
+
schema_cache_path: tmp/schema/main.yml
|
1003
|
+
```
|
728
1004
|
|
729
|
-
*
|
1005
|
+
*Katrina Owen*
|
730
1006
|
|
731
|
-
* `
|
732
|
-
`references` only, as `references` can be implicitly called by `where`.
|
1007
|
+
* Deprecate `#remove_connection` in favor of `#remove_connection_pool` when called on the handler.
|
733
1008
|
|
734
|
-
|
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.
|
735
1010
|
|
736
|
-
*
|
1011
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
737
1012
|
|
738
|
-
* `
|
739
|
-
need to generate it, it can be created with `rails g application_record`.
|
1013
|
+
* Deprecate `#default_hash` and it's alias `#[]` on database configurations.
|
740
1014
|
|
741
|
-
|
1015
|
+
Applications should use `configs_for`. `#default_hash` and `#[]` will be removed in 6.2.
|
742
1016
|
|
743
|
-
*
|
1017
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
744
1018
|
|
745
|
-
|
1019
|
+
* Add scale support to `ActiveRecord::Validations::NumericalityValidator`.
|
746
1020
|
|
747
|
-
*
|
748
|
-
|
749
|
-
|
1021
|
+
*Gannon McGibbon*
|
1022
|
+
|
1023
|
+
* Find orphans by looking for missing relations through chaining `where.missing`:
|
750
1024
|
|
751
|
-
|
1025
|
+
Before:
|
752
1026
|
|
753
|
-
|
1027
|
+
```ruby
|
1028
|
+
Post.left_joins(:author).where(authors: { id: nil })
|
1029
|
+
```
|
754
1030
|
|
755
|
-
|
756
|
-
bind values used by the `or` instead. (possibly other cases too)
|
1031
|
+
After:
|
757
1032
|
|
1033
|
+
```ruby
|
1034
|
+
Post.where.missing(:author)
|
758
1035
|
```
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
1036
|
+
|
1037
|
+
*Tom Rossi*
|
1038
|
+
|
1039
|
+
* Ensure `:reading` connections always raise if a write is attempted.
|
1040
|
+
|
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`.
|
1042
|
+
|
1043
|
+
*Eileen M. Uchitelle*
|
1044
|
+
|
1045
|
+
* Deprecate `"primary"` as the `connection_specification_name` for `ActiveRecord::Base`.
|
1046
|
+
|
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"`.
|
1048
|
+
|
1049
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
1050
|
+
|
1051
|
+
* Add `ActiveRecord::Validations::NumericalityValidator` with
|
1052
|
+
support for casting floats using a database columns' precision value.
|
1053
|
+
|
1054
|
+
*Gannon McGibbon*
|
1055
|
+
|
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.
|
1061
|
+
|
1062
|
+
Fixes #38078.
|
1063
|
+
|
1064
|
+
*Aaron Lipman*
|
1065
|
+
|
1066
|
+
* Skip test database when running `db:create` or `db:drop` in development
|
1067
|
+
with `DATABASE_URL` set.
|
1068
|
+
|
1069
|
+
*Brian Buchalter*
|
1070
|
+
|
1071
|
+
* Don't allow mutations on the database configurations hash.
|
1072
|
+
|
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.
|
1074
|
+
|
1075
|
+
Before:
|
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")
|
764
1080
|
```
|
765
1081
|
|
766
|
-
|
1082
|
+
After:
|
767
1083
|
|
768
|
-
|
769
|
-
|
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)
|
1088
|
+
```
|
770
1089
|
|
771
|
-
*
|
1090
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
772
1091
|
|
773
|
-
* `
|
774
|
-
`current_scope`, with the exception of `unscoped`.
|
1092
|
+
* Remove `:connection_id` from the `sql.active_record` notification.
|
775
1093
|
|
776
|
-
|
1094
|
+
*Aaron Patterson*, *Rafael Mendonça França*
|
777
1095
|
|
778
|
-
|
1096
|
+
* The `:name` key will no longer be returned as part of `DatabaseConfig#configuration_hash`. Please use `DatabaseConfig#owner_name` instead.
|
779
1097
|
|
780
|
-
*
|
1098
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
781
1099
|
|
782
|
-
|
783
|
-
recognize 't' and 'f' as was previously serialized.
|
1100
|
+
* ActiveRecord's `belongs_to_required_by_default` flag can now be set per model.
|
784
1101
|
|
785
|
-
|
786
|
-
|
787
|
-
whose default false value is deprecated.
|
1102
|
+
You can now opt-out/opt-in specific models from having their associations required
|
1103
|
+
by default.
|
788
1104
|
|
789
|
-
|
1105
|
+
This change is meant to ease the process of migrating all your models to have
|
1106
|
+
their association required.
|
790
1107
|
|
791
|
-
*
|
792
|
-
`in_batches`).
|
1108
|
+
*Edouard Chin*
|
793
1109
|
|
794
|
-
|
795
|
-
until the end of the request or job.
|
1110
|
+
* The `connection_config` method has been deprecated, please use `connection_db_config` instead which will return a `DatabaseConfigurations::DatabaseConfig` instead of a `Hash`.
|
796
1111
|
|
797
|
-
*
|
1112
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
798
1113
|
|
799
|
-
*
|
800
|
-
`ActiveRecord::StatementInvalid` exceptions.
|
1114
|
+
* Retain explicit selections on the base model after applying `includes` and `joins`.
|
801
1115
|
|
802
|
-
|
1116
|
+
Resolves #34889.
|
803
1117
|
|
804
|
-
*
|
1118
|
+
*Patrick Rebsch*
|
805
1119
|
|
806
|
-
|
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.
|
807
1121
|
|
808
|
-
*
|
1122
|
+
*Eileen M. Uchitelle*, *John Crepezzi*
|
809
1123
|
|
810
|
-
*
|
1124
|
+
* Allow attributes to be fetched from Arel node groupings.
|
811
1125
|
|
812
|
-
|
813
|
-
inner transaction would still be marked as persisted.
|
1126
|
+
*Jeff Emminger*, *Gannon McGibbon*
|
814
1127
|
|
815
|
-
|
816
|
-
parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
|
1128
|
+
* A database URL can now contain a querystring value that contains an equal sign. This is needed to support passing PostgreSQL `options`.
|
817
1129
|
|
818
|
-
*
|
1130
|
+
*Joshua Flanagan*
|
819
1131
|
|
820
|
-
*
|
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`.
|
821
1133
|
|
822
|
-
|
823
|
-
state of the transaction you can now use `rollback!`, `commit!` or `nullify!` instead of
|
824
|
-
`set_state(:rolledback)`, `set_state(:committed)`, or `set_state(nil)`.
|
1134
|
+
*John Crepezzi*
|
825
1135
|
|
826
|
-
|
1136
|
+
* Specifying `implicit_order_column` now subsorts the records by primary key if available to ensure deterministic results.
|
827
1137
|
|
828
|
-
*
|
1138
|
+
*Paweł Urbanek*
|
829
1139
|
|
830
|
-
|
1140
|
+
* `where(attr => [])` now loads an empty result without making a query.
|
831
1141
|
|
832
|
-
*
|
833
|
-
without being connected.
|
1142
|
+
*John Hawthorn*
|
834
1143
|
|
835
|
-
|
1144
|
+
* Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
|
836
1145
|
|
837
|
-
*
|
838
|
-
if the child records were deleted before the parent was saved, they would
|
839
|
-
still be persisted. Now, if child records are deleted before the parent is saved
|
840
|
-
on a `has_many :through` association, the child records will not be persisted.
|
1146
|
+
*Hiroyuki Ishii*
|
841
1147
|
|
842
|
-
|
1148
|
+
* Add support for `belongs_to` to `has_many` inversing.
|
843
1149
|
|
844
|
-
*
|
845
|
-
the merged relation into LEFT OUTER JOIN.
|
1150
|
+
*Gannon McGibbon*
|
846
1151
|
|
847
|
-
|
1152
|
+
* Allow length configuration for `has_secure_token` method. The minimum length
|
1153
|
+
is set at 24 characters.
|
848
1154
|
|
1155
|
+
Before:
|
1156
|
+
|
1157
|
+
```ruby
|
1158
|
+
has_secure_token :auth_token
|
849
1159
|
```
|
850
|
-
Author.joins(:posts).merge(Post.joins(:comments))
|
851
|
-
# Before the change:
|
852
|
-
#=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
|
853
1160
|
|
854
|
-
|
855
|
-
|
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
|
856
1167
|
```
|
857
1168
|
|
858
|
-
*
|
1169
|
+
*Bernardo de Araujo*
|
859
1170
|
|
860
|
-
* `
|
861
|
-
`locking_column`, without default value, is null in the database.
|
1171
|
+
* Deprecate `DatabaseConfigurations#to_h`. These connection hashes are still available via `ActiveRecord::Base.configurations.configs_for`.
|
862
1172
|
|
863
|
-
*
|
1173
|
+
*Eileen Uchitelle*, *John Crepezzi*
|
864
1174
|
|
865
|
-
*
|
866
|
-
`locking_column` is null in the database.
|
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.
|
867
1176
|
|
868
|
-
*
|
1177
|
+
*John Crepezzi*, *Eileen Uchitelle*
|
1178
|
+
|
1179
|
+
* Allow column names to be passed to `remove_index` positionally along with other options.
|
1180
|
+
|
1181
|
+
Passing other options can be necessary to make `remove_index` correctly reversible.
|
1182
|
+
|
1183
|
+
Before:
|
1184
|
+
|
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
|
1189
|
+
|
1190
|
+
After:
|
1191
|
+
|
1192
|
+
remove_index :reports, :report_id, unique: true # => works
|
1193
|
+
|
1194
|
+
*Eugene Kenny*
|
1195
|
+
|
1196
|
+
* Allow bulk `ALTER` statements to drop and recreate indexes with the same name.
|
1197
|
+
|
1198
|
+
*Eugene Kenny*
|
1199
|
+
|
1200
|
+
* `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
|
1201
|
+
|
1202
|
+
*Eugene Kenny*
|
1203
|
+
|
1204
|
+
* Call `while_preventing_writes` directly from `connected_to`.
|
1205
|
+
|
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)`.
|
1207
|
+
|
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.
|
1209
|
+
|
1210
|
+
*Eileen M. Uchitelle*
|
869
1211
|
|
870
|
-
*
|
1212
|
+
* Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
|
871
1213
|
|
872
1214
|
*Kir Shatrov*
|
873
1215
|
|
874
|
-
*
|
1216
|
+
* Stop trying to read yaml file fixtures when loading Active Record fixtures.
|
1217
|
+
|
1218
|
+
*Gannon McGibbon*
|
1219
|
+
|
1220
|
+
* Deprecate `.reorder(nil)` with `.first` / `.first!` taking non-deterministic result.
|
1221
|
+
|
1222
|
+
To continue taking non-deterministic result, use `.take` / `.take!` instead.
|
875
1223
|
|
876
1224
|
*Ryuta Kamizono*
|
877
1225
|
|
878
|
-
*
|
1226
|
+
* Preserve user supplied joins order as much as possible.
|
1227
|
+
|
1228
|
+
Fixes #36761, #34328, #24281, #12953.
|
879
1229
|
|
880
1230
|
*Ryuta Kamizono*
|
881
1231
|
|
882
|
-
*
|
1232
|
+
* Allow `matches_regex` and `does_not_match_regexp` on the MySQL Arel visitor.
|
883
1233
|
|
884
|
-
|
1234
|
+
*James Pearson*
|
885
1235
|
|
886
|
-
|
1236
|
+
* Allow specifying fixtures to be ignored by setting `ignore` in YAML file's '_fixture' section.
|
887
1237
|
|
888
|
-
*
|
889
|
-
in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
|
890
|
-
that does not include a timestamp any more.
|
1238
|
+
*Tongfei Gao*
|
891
1239
|
|
892
|
-
|
893
|
-
until you set `ActiveRecord::Base.cache_versioning = true`. That's the setting for all new apps on Rails 5.2+
|
1240
|
+
* Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
|
894
1241
|
|
895
|
-
*
|
1242
|
+
*John Crepezzi*, *Eileen Uchitelle*
|
896
1243
|
|
897
|
-
*
|
1244
|
+
* Add a warning for enum elements with 'not_' prefix.
|
898
1245
|
|
899
|
-
|
1246
|
+
class Foo
|
1247
|
+
enum status: [:sent, :not_sent]
|
1248
|
+
end
|
900
1249
|
|
901
|
-
*
|
1250
|
+
*Edu Depetris*
|
902
1251
|
|
903
|
-
|
1252
|
+
* Make currency symbols optional for money column type in PostgreSQL.
|
904
1253
|
|
905
|
-
*
|
1254
|
+
*Joel Schneider*
|
906
1255
|
|
907
|
-
*
|
1256
|
+
* Add support for beginless ranges, introduced in Ruby 2.7.
|
908
1257
|
|
909
|
-
*
|
1258
|
+
*Josh Goodall*
|
910
1259
|
|
911
|
-
*
|
912
|
-
when the current migration does not exist.
|
1260
|
+
* Add `database_exists?` method to connection adapters to check if a database exists.
|
913
1261
|
|
914
|
-
*
|
1262
|
+
*Guilherme Mansur*
|
915
1263
|
|
916
|
-
*
|
1264
|
+
* Loading the schema for a model that has no `table_name` raises a `TableNotSpecified` error.
|
917
1265
|
|
918
|
-
*
|
1266
|
+
*Guilherme Mansur*, *Eugene Kenny*
|
919
1267
|
|
920
|
-
*
|
1268
|
+
* PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
|
921
1269
|
|
922
|
-
|
923
|
-
See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
|
1270
|
+
Fixes #36022.
|
924
1271
|
|
925
1272
|
*Ryuta Kamizono*
|
926
1273
|
|
927
|
-
*
|
1274
|
+
* Make ActiveRecord `ConnectionPool.connections` method thread-safe.
|
928
1275
|
|
929
|
-
|
1276
|
+
Fixes #36465.
|
1277
|
+
|
1278
|
+
*Jeff Doering*
|
1279
|
+
|
1280
|
+
* Add support for multiple databases to `rails db:abort_if_pending_migrations`.
|
1281
|
+
|
1282
|
+
*Mark Lee*
|
1283
|
+
|
1284
|
+
* Fix sqlite3 collation parsing when using decimal columns.
|
1285
|
+
|
1286
|
+
*Martin R. Schuster*
|
1287
|
+
|
1288
|
+
* Fix invalid schema when primary key column has a comment.
|
1289
|
+
|
1290
|
+
Fixes #29966.
|
1291
|
+
|
1292
|
+
*Guilherme Goettems Schneider*
|
1293
|
+
|
1294
|
+
* Fix table comment also being applied to the primary key column.
|
1295
|
+
|
1296
|
+
*Guilherme Goettems Schneider*
|
930
1297
|
|
931
|
-
*
|
932
|
-
Previously this method always returned an empty array.
|
1298
|
+
* Allow generated `create_table` migrations to include or skip timestamps.
|
933
1299
|
|
934
|
-
*
|
1300
|
+
*Michael Duchemin*
|
935
1301
|
|
936
1302
|
|
937
|
-
Please check [
|
1303
|
+
Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/activerecord/CHANGELOG.md) for previous changes.
|