activerecord 5.2.4.1 → 6.0.1
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 +676 -572
- data/MIT-LICENSE +3 -1
- data/README.rdoc +4 -2
- data/examples/performance.rb +1 -1
- data/lib/active_record.rb +9 -2
- data/lib/active_record/aggregations.rb +4 -2
- data/lib/active_record/association_relation.rb +15 -6
- data/lib/active_record/associations.rb +20 -15
- data/lib/active_record/associations/association.rb +61 -20
- data/lib/active_record/associations/association_scope.rb +4 -6
- data/lib/active_record/associations/belongs_to_association.rb +36 -42
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
- data/lib/active_record/associations/builder/association.rb +14 -18
- data/lib/active_record/associations/builder/belongs_to.rb +19 -52
- data/lib/active_record/associations/builder/collection_association.rb +3 -13
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
- data/lib/active_record/associations/builder/has_many.rb +2 -0
- data/lib/active_record/associations/builder/has_one.rb +35 -1
- data/lib/active_record/associations/builder/singular_association.rb +2 -0
- data/lib/active_record/associations/collection_association.rb +6 -21
- data/lib/active_record/associations/collection_proxy.rb +12 -15
- data/lib/active_record/associations/foreign_association.rb +7 -0
- data/lib/active_record/associations/has_many_association.rb +2 -10
- data/lib/active_record/associations/has_many_through_association.rb +14 -14
- data/lib/active_record/associations/has_one_association.rb +28 -30
- data/lib/active_record/associations/has_one_through_association.rb +5 -5
- data/lib/active_record/associations/join_dependency.rb +28 -28
- data/lib/active_record/associations/join_dependency/join_association.rb +9 -10
- data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
- data/lib/active_record/associations/preloader.rb +40 -32
- data/lib/active_record/associations/preloader/association.rb +38 -36
- data/lib/active_record/associations/preloader/through_association.rb +48 -39
- data/lib/active_record/associations/singular_association.rb +2 -16
- data/lib/active_record/attribute_assignment.rb +7 -10
- data/lib/active_record/attribute_methods.rb +28 -100
- data/lib/active_record/attribute_methods/before_type_cast.rb +4 -1
- data/lib/active_record/attribute_methods/dirty.rb +111 -40
- data/lib/active_record/attribute_methods/primary_key.rb +15 -22
- data/lib/active_record/attribute_methods/query.rb +2 -3
- data/lib/active_record/attribute_methods/read.rb +15 -53
- data/lib/active_record/attribute_methods/serialization.rb +1 -1
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
- data/lib/active_record/attribute_methods/write.rb +17 -24
- data/lib/active_record/attributes.rb +13 -0
- data/lib/active_record/autosave_association.rb +2 -2
- data/lib/active_record/base.rb +2 -3
- data/lib/active_record/callbacks.rb +5 -19
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +104 -16
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -4
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +99 -123
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +18 -8
- data/lib/active_record/connection_adapters/abstract/quoting.rb +68 -17
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +19 -12
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +76 -48
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -3
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +132 -53
- data/lib/active_record/connection_adapters/abstract/transaction.rb +96 -56
- data/lib/active_record/connection_adapters/abstract_adapter.rb +187 -43
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +138 -195
- data/lib/active_record/connection_adapters/column.rb +17 -13
- data/lib/active_record/connection_adapters/connection_specification.rb +53 -43
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +6 -10
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +75 -13
- data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +40 -32
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +14 -6
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +129 -13
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +6 -10
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +26 -9
- data/lib/active_record/connection_adapters/postgresql/column.rb +17 -31
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +22 -1
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/range.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 +6 -3
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +12 -1
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -91
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +55 -53
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +24 -27
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +164 -74
- data/lib/active_record/connection_adapters/schema_cache.rb +37 -14
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +11 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +120 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +42 -6
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +42 -11
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +129 -141
- data/lib/active_record/connection_handling.rb +155 -26
- data/lib/active_record/core.rb +103 -59
- data/lib/active_record/counter_cache.rb +4 -29
- data/lib/active_record/database_configurations.rb +233 -0
- data/lib/active_record/database_configurations/database_config.rb +37 -0
- data/lib/active_record/database_configurations/hash_config.rb +50 -0
- data/lib/active_record/database_configurations/url_config.rb +79 -0
- data/lib/active_record/dynamic_matchers.rb +1 -1
- data/lib/active_record/enum.rb +37 -7
- data/lib/active_record/errors.rb +15 -7
- data/lib/active_record/explain.rb +1 -1
- data/lib/active_record/fixture_set/model_metadata.rb +33 -0
- data/lib/active_record/fixture_set/render_context.rb +17 -0
- data/lib/active_record/fixture_set/table_row.rb +153 -0
- data/lib/active_record/fixture_set/table_rows.rb +47 -0
- data/lib/active_record/fixtures.rb +145 -472
- data/lib/active_record/gem_version.rb +4 -4
- data/lib/active_record/inheritance.rb +13 -3
- data/lib/active_record/insert_all.rb +179 -0
- data/lib/active_record/integration.rb +68 -16
- data/lib/active_record/internal_metadata.rb +10 -2
- data/lib/active_record/locking/optimistic.rb +5 -6
- data/lib/active_record/locking/pessimistic.rb +3 -3
- data/lib/active_record/log_subscriber.rb +7 -26
- data/lib/active_record/middleware/database_selector.rb +75 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +88 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
- data/lib/active_record/migration.rb +100 -81
- data/lib/active_record/migration/command_recorder.rb +50 -6
- data/lib/active_record/migration/compatibility.rb +76 -49
- data/lib/active_record/model_schema.rb +33 -9
- data/lib/active_record/nested_attributes.rb +2 -2
- data/lib/active_record/no_touching.rb +7 -0
- data/lib/active_record/persistence.rb +228 -24
- data/lib/active_record/query_cache.rb +11 -4
- data/lib/active_record/querying.rb +32 -20
- data/lib/active_record/railtie.rb +80 -43
- data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
- data/lib/active_record/railties/controller_runtime.rb +30 -35
- data/lib/active_record/railties/databases.rake +196 -46
- data/lib/active_record/reflection.rb +32 -30
- data/lib/active_record/relation.rb +311 -80
- data/lib/active_record/relation/batches.rb +13 -10
- data/lib/active_record/relation/calculations.rb +53 -47
- data/lib/active_record/relation/delegation.rb +26 -43
- data/lib/active_record/relation/finder_methods.rb +23 -27
- data/lib/active_record/relation/merger.rb +11 -20
- data/lib/active_record/relation/predicate_builder.rb +4 -6
- data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
- data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
- data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
- data/lib/active_record/relation/query_attribute.rb +13 -8
- data/lib/active_record/relation/query_methods.rb +202 -64
- data/lib/active_record/relation/spawn_methods.rb +1 -1
- data/lib/active_record/relation/where_clause.rb +14 -10
- data/lib/active_record/relation/where_clause_factory.rb +1 -2
- data/lib/active_record/result.rb +30 -11
- data/lib/active_record/sanitization.rb +32 -40
- data/lib/active_record/schema.rb +2 -11
- data/lib/active_record/schema_dumper.rb +22 -7
- data/lib/active_record/schema_migration.rb +5 -1
- data/lib/active_record/scoping.rb +8 -8
- data/lib/active_record/scoping/default.rb +4 -5
- data/lib/active_record/scoping/named.rb +19 -15
- data/lib/active_record/statement_cache.rb +30 -3
- data/lib/active_record/store.rb +87 -8
- data/lib/active_record/table_metadata.rb +10 -17
- data/lib/active_record/tasks/database_tasks.rb +194 -25
- data/lib/active_record/tasks/mysql_database_tasks.rb +5 -5
- data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
- data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
- data/lib/active_record/test_databases.rb +23 -0
- data/lib/active_record/test_fixtures.rb +224 -0
- data/lib/active_record/timestamp.rb +39 -25
- data/lib/active_record/touch_later.rb +4 -2
- data/lib/active_record/transactions.rb +56 -65
- data/lib/active_record/translation.rb +1 -1
- data/lib/active_record/type.rb +3 -4
- data/lib/active_record/type/adapter_specific_registry.rb +1 -8
- data/lib/active_record/type_caster/connection.rb +15 -14
- data/lib/active_record/type_caster/map.rb +1 -4
- data/lib/active_record/validations.rb +1 -0
- data/lib/active_record/validations/uniqueness.rb +15 -27
- data/lib/arel.rb +58 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes.rb +22 -0
- data/lib/arel/attributes/attribute.rb +37 -0
- data/lib/arel/collectors/bind.rb +24 -0
- data/lib/arel/collectors/composite.rb +31 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +20 -0
- data/lib/arel/collectors/substitute_binds.rb +28 -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.rb +68 -0
- data/lib/arel/nodes/and.rb +32 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +52 -0
- data/lib/arel/nodes/bind_param.rb +36 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +50 -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 +18 -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 +8 -0
- data/lib/arel/nodes/in.rb +8 -0
- data/lib/arel/nodes/infix_operation.rb +80 -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 +50 -0
- data/lib/arel/nodes/node_expression.rb +13 -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 +16 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +27 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +45 -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/order_predications.rb +13 -0
- data/lib/arel/predications.rb +257 -0
- data/lib/arel/select_manager.rb +271 -0
- data/lib/arel/table.rb +110 -0
- data/lib/arel/tree_manager.rb +72 -0
- data/lib/arel/update_manager.rb +34 -0
- data/lib/arel/visitors.rb +20 -0
- data/lib/arel/visitors/depth_first.rb +204 -0
- data/lib/arel/visitors/dot.rb +297 -0
- data/lib/arel/visitors/ibm_db.rb +34 -0
- data/lib/arel/visitors/informix.rb +62 -0
- data/lib/arel/visitors/mssql.rb +157 -0
- data/lib/arel/visitors/mysql.rb +83 -0
- data/lib/arel/visitors/oracle.rb +159 -0
- data/lib/arel/visitors/oracle12.rb +66 -0
- data/lib/arel/visitors/postgresql.rb +110 -0
- data/lib/arel/visitors/sqlite.rb +39 -0
- data/lib/arel/visitors/to_sql.rb +889 -0
- data/lib/arel/visitors/visitor.rb +46 -0
- data/lib/arel/visitors/where_sql.rb +23 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/rails/generators/active_record/migration.rb +14 -1
- data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +1 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +4 -2
- data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +10 -1
- metadata +110 -25
- data/lib/active_record/collection_cache_key.rb +0 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74e749ea0406c6090f479a06ed90ab6d7be8a341b3662329c623d212652ef0d3
|
4
|
+
data.tar.gz: 9daac4d5a5f794386f5580724c8a9f27c9a42c3db561d5a37ec314ac5715f0f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ae5468a2a52b707a9f111b1f416d6d3a63ebbfe1658f29f2d64062bbd0cd5408e7b620a4da8cabd8000ea484bbeecd2c70ecb36a94c9a2f91afac32a032ee73
|
7
|
+
data.tar.gz: 455c884ff4d115d562aa05df54beda3aea735b6b3fb0e29202280eca45fe9f4fad6d2b34a033fd6175048286fadd3ec90a975b02c54653f5a93fd9ac4a8f2d0b
|
data/CHANGELOG.md
CHANGED
@@ -1,982 +1,1086 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 6.0.1 (November 5, 2019) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Common Table Expressions are allowed on read-only connections.
|
4
4
|
|
5
|
+
*Chris Morris*
|
5
6
|
|
6
|
-
|
7
|
+
* New record instantiation respects `unscope`.
|
7
8
|
|
8
|
-
*
|
9
|
+
*Ryuta Kamizono*
|
9
10
|
|
10
|
-
|
11
|
-
associations, the callback for a `has_many` association was run while
|
12
|
-
another instance of the same callback on the same association hadn't
|
13
|
-
finished running. When control returned to the first instance of the
|
14
|
-
callback, the instance variable had changed, and subsequent associated
|
15
|
-
records weren't saved correctly. Specifically, the ID field for the
|
16
|
-
`belongs_to` corresponding to the `has_many` was `nil`.
|
11
|
+
* Fixed a case where `find_in_batches` could halt too early.
|
17
12
|
|
18
|
-
|
13
|
+
*Takayuki Nakata*
|
19
14
|
|
20
|
-
|
15
|
+
* Autosaved associations always perform validations when a custom validation
|
16
|
+
context is used.
|
21
17
|
|
22
|
-
*
|
18
|
+
*Tekin Suleyman*
|
23
19
|
|
24
|
-
|
20
|
+
* `sql.active_record` notifications now include the `:connection` in
|
21
|
+
their payloads.
|
25
22
|
|
26
|
-
|
23
|
+
*Eugene Kenny*
|
27
24
|
|
28
|
-
*
|
25
|
+
* A rollback encountered in an `after_commit` callback does not reset
|
26
|
+
previously-committed record state.
|
29
27
|
|
30
|
-
|
28
|
+
*Ryuta Kamizono*
|
31
29
|
|
32
|
-
*
|
30
|
+
* Fixed that join order was lost when eager-loading.
|
33
31
|
|
34
|
-
|
32
|
+
*Ryuta Kamizono*
|
35
33
|
|
36
|
-
|
34
|
+
* `DESCRIBE` queries are allowed on read-only connections.
|
37
35
|
|
38
|
-
*
|
39
|
-
`before_add` and `after_add` callbacks for `has_many :through` associations.
|
36
|
+
*Dylan Thacker-Smith*
|
40
37
|
|
41
|
-
|
38
|
+
* Fixed that records that had been `inspect`ed could not be marshaled.
|
42
39
|
|
43
|
-
*
|
40
|
+
*Eugene Kenny*
|
44
41
|
|
42
|
+
* The connection pool reaper thread is respawned in forked processes. This
|
43
|
+
fixes that idle connections in forked processes wouldn't be reaped.
|
45
44
|
|
46
|
-
|
45
|
+
*John Hawthorn*
|
47
46
|
|
48
|
-
*
|
47
|
+
* The memoized result of `ActiveRecord::Relation#take` is properly cleared
|
48
|
+
when `ActiveRecord::Relation#reset` or `ActiveRecord::Relation#reload`
|
49
|
+
is called.
|
49
50
|
|
50
|
-
|
51
|
+
*Anmol Arora*
|
51
52
|
|
52
|
-
|
53
|
+
* Fixed the performance regression for `primary_keys` introduced MySQL 8.0.
|
53
54
|
|
54
|
-
*
|
55
|
+
*Hiroyuki Ishii*
|
55
56
|
|
56
|
-
|
57
|
+
* `insert`, `insert_all`, `upsert`, and `upsert_all` now clear the query cache.
|
57
58
|
|
58
|
-
*
|
59
|
+
*Eugene Kenny*
|
59
60
|
|
60
|
-
|
61
|
+
* Call `while_preventing_writes` directly from `connected_to`.
|
61
62
|
|
62
|
-
|
63
|
+
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)`.
|
63
64
|
|
64
|
-
|
65
|
+
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.
|
65
66
|
|
66
|
-
|
67
|
+
*Eileen M. Uchitelle*
|
67
68
|
|
68
|
-
|
69
|
+
* Improve detection of ActiveRecord::StatementTimeout with mysql2 adapter in the edge case when the query is terminated during filesort.
|
69
70
|
|
70
|
-
*
|
71
|
+
*Kir Shatrov*
|
71
72
|
|
72
|
-
*Gannon McGibbon*
|
73
73
|
|
74
|
-
|
74
|
+
## Rails 6.0.0 (August 16, 2019) ##
|
75
|
+
|
76
|
+
* Preserve user supplied joins order as much as possible.
|
77
|
+
|
78
|
+
Fixes #36761, #34328, #24281, #12953.
|
75
79
|
|
76
80
|
*Ryuta Kamizono*
|
77
81
|
|
78
|
-
*
|
82
|
+
* Make the DATABASE_URL env variable only affect the primary connection. Add new env variables for multiple databases.
|
79
83
|
|
80
|
-
*
|
84
|
+
*John Crepezzi*, *Eileen Uchitelle*
|
85
|
+
|
86
|
+
* Add a warning for enum elements with 'not_' prefix.
|
81
87
|
|
88
|
+
class Foo
|
89
|
+
enum status: [:sent, :not_sent]
|
90
|
+
end
|
82
91
|
|
83
|
-
|
92
|
+
*Edu Depetris*
|
84
93
|
|
85
|
-
*
|
94
|
+
* Make currency symbols optional for money column type in PostgreSQL
|
95
|
+
|
96
|
+
*Joel Schneider*
|
97
|
+
|
98
|
+
|
99
|
+
## Rails 6.0.0.rc2 (July 22, 2019) ##
|
100
|
+
|
101
|
+
* Add database_exists? method to connection adapters to check if a database exists.
|
86
102
|
|
103
|
+
*Guilherme Mansur*
|
87
104
|
|
88
|
-
|
105
|
+
* PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
|
89
106
|
|
90
|
-
|
107
|
+
Fixes #36022.
|
91
108
|
|
92
109
|
*Ryuta Kamizono*
|
93
110
|
|
94
|
-
*
|
111
|
+
* Make ActiveRecord `ConnectionPool.connections` method thread-safe.
|
95
112
|
|
96
|
-
|
113
|
+
Fixes #36465.
|
97
114
|
|
98
|
-
*
|
115
|
+
*Jeff Doering*
|
99
116
|
|
100
|
-
|
101
|
-
adapter.
|
117
|
+
* Fix sqlite3 collation parsing when using decimal columns.
|
102
118
|
|
103
|
-
*
|
119
|
+
*Martin R. Schuster*
|
104
120
|
|
105
|
-
*
|
121
|
+
* Fix invalid schema when primary key column has a comment.
|
106
122
|
|
107
|
-
|
108
|
-
was passing for SQLite and MySQL, but failed for PostgreSQL:
|
123
|
+
Fixes #29966.
|
109
124
|
|
110
|
-
|
111
|
-
class DeveloperName < ActiveRecord::Type::String
|
112
|
-
def deserialize(value)
|
113
|
-
"Developer: #{value}"
|
114
|
-
end
|
115
|
-
end
|
125
|
+
*Guilherme Goettems Schneider*
|
116
126
|
|
117
|
-
|
118
|
-
self.table_name = "developers"
|
127
|
+
* Fix table comment also being applied to the primary key column.
|
119
128
|
|
120
|
-
|
129
|
+
*Guilherme Goettems Schneider*
|
121
130
|
|
122
|
-
|
123
|
-
end
|
131
|
+
* Fix merging left_joins to maintain its own `join_type` context.
|
124
132
|
|
125
|
-
|
126
|
-
developer.update_column :name, "name"
|
133
|
+
Fixes #36103.
|
127
134
|
|
128
|
-
|
129
|
-
|
135
|
+
*Ryuta Kamizono*
|
136
|
+
|
137
|
+
|
138
|
+
## Rails 6.0.0.rc1 (April 24, 2019) ##
|
139
|
+
|
140
|
+
* Add `touch` option to `has_one` association.
|
141
|
+
|
142
|
+
*Abhay Nikam*
|
143
|
+
|
144
|
+
* Deprecate `where.not` working as NOR and will be changed to NAND in Rails 6.1.
|
145
|
+
|
146
|
+
```ruby
|
147
|
+
all = [treasures(:diamond), treasures(:sapphire), cars(:honda), treasures(:sapphire)]
|
148
|
+
assert_equal all, PriceEstimate.all.map(&:estimate_of)
|
130
149
|
```
|
131
150
|
|
132
|
-
|
151
|
+
In Rails 6.0:
|
133
152
|
|
134
|
-
|
153
|
+
```ruby
|
154
|
+
sapphire = treasures(:sapphire)
|
155
|
+
|
156
|
+
nor = all.reject { |e|
|
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)
|
167
|
+
```
|
135
168
|
|
136
|
-
|
169
|
+
In Rails 6.1:
|
137
170
|
|
138
|
-
|
139
|
-
|
171
|
+
```ruby
|
172
|
+
sapphire = treasures(:sapphire)
|
140
173
|
|
141
|
-
|
174
|
+
nand = all - [sapphire]
|
175
|
+
assert_equal [treasures(:diamond), cars(:honda)], nand
|
142
176
|
|
143
|
-
|
177
|
+
without_sapphire = PriceEstimate.where.not(
|
178
|
+
estimate_of_type: sapphire.class.polymorphic_name, estimate_of_id: sapphire.id
|
179
|
+
)
|
180
|
+
assert_equal nand, without_sapphire.map(&:estimate_of)
|
181
|
+
```
|
144
182
|
|
145
183
|
*Ryuta Kamizono*
|
146
184
|
|
147
|
-
* Fix
|
185
|
+
* Fix dirty tracking after rollback.
|
148
186
|
|
149
|
-
|
187
|
+
Fixes #15018, #30167, #33868.
|
150
188
|
|
151
|
-
*
|
189
|
+
*Ryuta Kamizono*
|
152
190
|
|
153
|
-
|
191
|
+
* Add `ActiveRecord::Relation#cache_version` to support recyclable cache keys via
|
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.
|
154
195
|
|
155
|
-
|
196
|
+
NOTE: This feature is turned off by default, and `cache_key` will still return
|
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+
|
156
199
|
|
157
|
-
*
|
200
|
+
*Lachlan Sylvester*
|
158
201
|
|
159
|
-
|
202
|
+
* Fix dirty tracking for `touch` to track saved changes.
|
160
203
|
|
161
|
-
|
204
|
+
Fixes #33429.
|
162
205
|
|
163
|
-
*
|
206
|
+
*Ryuta Kamzono*
|
164
207
|
|
165
|
-
*
|
208
|
+
* `change_column_comment` and `change_table_comment` are invertible only if
|
209
|
+
`to` and `from` options are specified.
|
166
210
|
|
167
|
-
*
|
211
|
+
*Yoshiyuki Kinjo*
|
168
212
|
|
169
|
-
*
|
213
|
+
* Don't call commit/rollback callbacks when a record isn't saved.
|
170
214
|
|
171
|
-
|
215
|
+
Fixes #29747.
|
172
216
|
|
173
|
-
*
|
217
|
+
*Ryuta Kamizono*
|
174
218
|
|
175
|
-
|
219
|
+
* Fix circular `autosave: true` causes invalid records to be saved.
|
176
220
|
|
177
|
-
|
221
|
+
Prior to the fix, when there was a circular series of `autosave: true`
|
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`.
|
178
228
|
|
179
|
-
|
229
|
+
Fixes #28080.
|
230
|
+
|
231
|
+
*Larry Reid*
|
232
|
+
|
233
|
+
* Raise `ArgumentError` for invalid `:limit` and `:precision` like as other options.
|
234
|
+
|
235
|
+
Before:
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
add_column :items, :attr1, :binary, size: 10 # => ArgumentError
|
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
|
+
```
|
243
|
+
|
244
|
+
After:
|
180
245
|
|
181
|
-
|
246
|
+
```ruby
|
247
|
+
add_column :items, :attr1, :binary, size: 10 # => ArgumentError
|
248
|
+
add_column :items, :attr2, :decimal, scale: 10 # => ArgumentError
|
249
|
+
add_column :items, :attr3, :integer, limit: 10 # => ArgumentError
|
250
|
+
add_column :items, :attr4, :datetime, precision: 10 # => ArgumentError
|
251
|
+
```
|
182
252
|
|
183
253
|
*Ryuta Kamizono*
|
184
254
|
|
185
|
-
*
|
255
|
+
* Association loading isn't to be affected by scoping consistently
|
256
|
+
whether preloaded / eager loaded or not, with the exception of `unscoped`.
|
186
257
|
|
187
|
-
|
258
|
+
Before:
|
188
259
|
|
260
|
+
```ruby
|
261
|
+
Post.where("1=0").scoping do
|
262
|
+
Comment.find(1).post # => nil
|
263
|
+
Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
|
264
|
+
Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
|
265
|
+
end
|
266
|
+
```
|
189
267
|
|
190
|
-
|
268
|
+
After:
|
191
269
|
|
192
|
-
|
270
|
+
```ruby
|
271
|
+
Post.where("1=0").scoping do
|
272
|
+
Comment.find(1).post # => #<Post id: 1, ...>
|
273
|
+
Comment.preload(:post).find(1).post # => #<Post id: 1, ...>
|
274
|
+
Comment.eager_load(:post).find(1).post # => #<Post id: 1, ...>
|
275
|
+
end
|
276
|
+
```
|
193
277
|
|
278
|
+
Fixes #34638, #35398.
|
194
279
|
|
195
|
-
|
280
|
+
*Ryuta Kamizono*
|
196
281
|
|
197
|
-
*
|
282
|
+
* Add `rails db:prepare` to migrate or setup a database.
|
198
283
|
|
199
|
-
|
284
|
+
Runs `db:migrate` if the database exists or `db:setup` if it doesn't.
|
200
285
|
|
201
|
-
*
|
286
|
+
*Roberto Miranda*
|
202
287
|
|
203
|
-
*
|
288
|
+
* Add `after_save_commit` callback as shortcut for `after_commit :hook, on: [ :create, :update ]`.
|
204
289
|
|
205
|
-
*
|
290
|
+
*DHH*
|
206
291
|
|
207
|
-
*
|
292
|
+
* Assign all attributes before calling `build` to ensure the child record is visible in
|
293
|
+
`before_add` and `after_add` callbacks for `has_many :through` associations.
|
208
294
|
|
209
|
-
|
295
|
+
Fixes #33249.
|
210
296
|
|
211
|
-
*
|
297
|
+
*Ryan H. Kerr*
|
212
298
|
|
213
|
-
|
299
|
+
* Add `ActiveRecord::Relation#extract_associated` for extracting associated records from a relation.
|
214
300
|
|
215
|
-
|
301
|
+
```
|
302
|
+
account.memberships.extract_associated(:user)
|
303
|
+
# => Returns collection of User records
|
304
|
+
```
|
216
305
|
|
217
|
-
|
306
|
+
*DHH*
|
218
307
|
|
219
|
-
|
308
|
+
* Add `ActiveRecord::Relation#annotate` for adding SQL comments to its queries.
|
220
309
|
|
221
|
-
|
310
|
+
For example:
|
222
311
|
|
223
|
-
|
312
|
+
```
|
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
|
+
```
|
224
316
|
|
225
|
-
|
317
|
+
This can be useful in instrumentation or other analysis of issued queries.
|
226
318
|
|
227
|
-
|
319
|
+
*Matt Yoho*
|
228
320
|
|
229
|
-
|
321
|
+
* Support Optimizer Hints.
|
230
322
|
|
231
|
-
|
323
|
+
In most databases, a way to control the optimizer is by using optimizer hints,
|
324
|
+
which can be specified within individual statements.
|
232
325
|
|
233
|
-
|
326
|
+
Example (for MySQL):
|
234
327
|
|
235
|
-
|
328
|
+
Topic.optimizer_hints("MAX_EXECUTION_TIME(50000)", "NO_INDEX_MERGE(topics)")
|
329
|
+
# SELECT /*+ MAX_EXECUTION_TIME(50000) NO_INDEX_MERGE(topics) */ `topics`.* FROM `topics`
|
330
|
+
|
331
|
+
Example (for PostgreSQL with pg_hint_plan):
|
236
332
|
|
237
|
-
|
333
|
+
Topic.optimizer_hints("SeqScan(topics)", "Parallel(topics 8)")
|
334
|
+
# SELECT /*+ SeqScan(topics) Parallel(topics 8) */ "topics".* FROM "topics"
|
238
335
|
|
239
|
-
|
336
|
+
See also:
|
337
|
+
|
338
|
+
* https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html
|
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
|
240
343
|
|
241
344
|
*Ryuta Kamizono*
|
242
345
|
|
243
|
-
*
|
346
|
+
* Fix query attribute method on user-defined attribute to be aware of typecasted value.
|
244
347
|
|
245
|
-
|
348
|
+
For example, the following code no longer return false as casted non-empty string:
|
246
349
|
|
247
|
-
|
248
|
-
|
350
|
+
```
|
351
|
+
class Post < ActiveRecord::Base
|
352
|
+
attribute :user_defined_text, :text
|
353
|
+
end
|
249
354
|
|
250
|
-
|
355
|
+
Post.new(user_defined_text: "false").user_defined_text? # => true
|
356
|
+
```
|
251
357
|
|
252
|
-
*
|
358
|
+
*Yuji Kamijima*
|
253
359
|
|
254
|
-
*
|
255
|
-
query cache.
|
360
|
+
* Quote empty ranges like other empty enumerables.
|
256
361
|
|
257
|
-
*
|
362
|
+
*Patrick Rebsch*
|
258
363
|
|
364
|
+
* Add `insert_all`/`insert_all!`/`upsert_all` methods to `ActiveRecord::Persistence`,
|
365
|
+
allowing bulk inserts akin to the bulk updates provided by `update_all` and
|
366
|
+
bulk deletes by `delete_all`.
|
259
367
|
|
260
|
-
|
368
|
+
Supports skipping or upserting duplicates through the `ON CONFLICT` syntax
|
369
|
+
for PostgreSQL (9.5+) and SQLite (3.24+) and `ON DUPLICATE KEY UPDATE` syntax
|
370
|
+
for MySQL.
|
261
371
|
|
262
|
-
*
|
372
|
+
*Bob Lail*
|
263
373
|
|
264
|
-
|
374
|
+
* Add `rails db:seed:replant` that truncates tables of each database
|
375
|
+
for current environment and loads the seeds.
|
265
376
|
|
266
|
-
*
|
377
|
+
*bogdanvlviv*, *DHH*
|
267
378
|
|
268
|
-
|
269
|
-
have a specified precision then on assignment the value is rounded to
|
270
|
-
that precision. This behavior is now applied to time columns as well.
|
379
|
+
* Add `ActiveRecord::Base.connection.truncate` for SQLite3 adapter.
|
271
380
|
|
272
|
-
|
381
|
+
*bogdanvlviv*
|
273
382
|
|
274
|
-
|
383
|
+
* Deprecate mismatched collation comparison for uniqueness validator.
|
275
384
|
|
276
|
-
|
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.
|
277
388
|
|
278
|
-
|
279
|
-
because until #24542 the quoting for time columns didn't remove the date
|
280
|
-
component. To ensure that values are consistent we now normalize the
|
281
|
-
date component to 2001-01-01 on reading and writing.
|
389
|
+
*Ryuta Kamizono*
|
282
390
|
|
283
|
-
|
391
|
+
* Add `reselect` method. This is a short-hand for `unscope(:select).select(fields)`.
|
284
392
|
|
285
|
-
|
393
|
+
Fixes #27340.
|
286
394
|
|
287
|
-
|
288
|
-
was removed however it only removed it when it was 2001-01-01. Now the
|
289
|
-
date component is removed irrespective of what the date is.
|
395
|
+
*Willian Gustavo Veiga*
|
290
396
|
|
291
|
-
|
397
|
+
* Add negative scopes for all enum values.
|
292
398
|
|
293
|
-
|
294
|
-
the parent class was getting deleted when the child was not.
|
399
|
+
Example:
|
295
400
|
|
296
|
-
|
401
|
+
class Post < ActiveRecord::Base
|
402
|
+
enum status: %i[ drafted active trashed ]
|
403
|
+
end
|
297
404
|
|
298
|
-
|
405
|
+
Post.not_drafted # => where.not(status: :drafted)
|
406
|
+
Post.not_active # => where.not(status: :active)
|
407
|
+
Post.not_trashed # => where.not(status: :trashed)
|
299
408
|
|
300
|
-
*
|
409
|
+
*DHH*
|
301
410
|
|
302
|
-
|
411
|
+
* Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
|
303
412
|
|
304
|
-
|
413
|
+
Fixes #35214.
|
305
414
|
|
306
|
-
*
|
415
|
+
*Juani Villarejo*
|
307
416
|
|
308
|
-
* Fix `#columns_for_distinct` of MySQL and PostgreSQL to make
|
309
|
-
`ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
|
310
|
-
even if `ORDER BY` columns include other table's primary key.
|
311
417
|
|
312
|
-
|
418
|
+
## Rails 6.0.0.beta3 (March 11, 2019) ##
|
313
419
|
|
314
|
-
|
420
|
+
* No changes.
|
315
421
|
|
316
|
-
* Make `reflection.klass` raise if `polymorphic?` not to be misused.
|
317
422
|
|
318
|
-
|
423
|
+
## Rails 6.0.0.beta2 (February 25, 2019) ##
|
424
|
+
|
425
|
+
* Fix prepared statements caching to be enabled even when query caching is enabled.
|
319
426
|
|
320
427
|
*Ryuta Kamizono*
|
321
428
|
|
322
|
-
*
|
429
|
+
* Ensure `update_all` series cares about optimistic locking.
|
323
430
|
|
324
|
-
*
|
431
|
+
*Ryuta Kamizono*
|
325
432
|
|
326
|
-
*
|
327
|
-
Using a `Relation` for performing queries is the prefered API.
|
433
|
+
* Don't allow `where` with non numeric string matches to 0 values.
|
328
434
|
|
329
435
|
*Ryuta Kamizono*
|
330
436
|
|
331
|
-
*
|
437
|
+
* Introduce `ActiveRecord::Relation#destroy_by` and `ActiveRecord::Relation#delete_by`.
|
332
438
|
|
333
|
-
|
334
|
-
|
335
|
-
Customer.where(balance: [david_balance]).to_sql
|
439
|
+
`destroy_by` allows relation to find all the records matching the condition and perform
|
440
|
+
`destroy_all` on the matched records.
|
336
441
|
|
337
|
-
|
338
|
-
# After : WHERE `customers`.`balance` = 50
|
339
|
-
```
|
442
|
+
Example:
|
340
443
|
|
341
|
-
|
444
|
+
Person.destroy_by(name: 'David')
|
445
|
+
Person.destroy_by(name: 'David', rating: 4)
|
342
446
|
|
343
|
-
|
447
|
+
david = Person.find_by(name: 'David')
|
448
|
+
david.posts.destroy_by(id: [1, 2, 3])
|
344
449
|
|
345
|
-
|
450
|
+
`delete_by` allows relation to find all the records matching the condition and perform
|
451
|
+
`delete_all` on the matched records.
|
346
452
|
|
347
|
-
|
453
|
+
Example:
|
348
454
|
|
349
|
-
|
455
|
+
Person.delete_by(name: 'David')
|
456
|
+
Person.delete_by(name: 'David', rating: 4)
|
350
457
|
|
351
|
-
|
458
|
+
david = Person.find_by(name: 'David')
|
459
|
+
david.posts.delete_by(id: [1, 2, 3])
|
352
460
|
|
353
|
-
|
461
|
+
*Abhay Nikam*
|
354
462
|
|
355
|
-
|
463
|
+
* Don't allow `where` with invalid value matches to nil values.
|
356
464
|
|
357
|
-
|
465
|
+
Fixes #33624.
|
358
466
|
|
359
|
-
*
|
467
|
+
*Ryuta Kamizono*
|
360
468
|
|
361
|
-
*
|
469
|
+
* SQLite3: Implement `add_foreign_key` and `remove_foreign_key`.
|
362
470
|
|
363
|
-
*
|
471
|
+
*Ryuta Kamizono*
|
364
472
|
|
365
|
-
*
|
473
|
+
* Deprecate using class level querying methods if the receiver scope
|
474
|
+
regarded as leaked. Use `klass.unscoped` to avoid the leaking scope.
|
366
475
|
|
367
476
|
*Ryuta Kamizono*
|
368
477
|
|
369
|
-
*
|
478
|
+
* Allow applications to automatically switch connections.
|
370
479
|
|
371
|
-
|
480
|
+
Adds a middleware and configuration options that can be used in your
|
481
|
+
application to automatically switch between the writing and reading
|
482
|
+
database connections.
|
372
483
|
|
373
|
-
|
484
|
+
`GET` and `HEAD` requests will read from the replica unless there was
|
485
|
+
a write in the last 2 seconds, otherwise they will read from the primary.
|
486
|
+
Non-get requests will always write to the primary. The middleware accepts
|
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.
|
374
490
|
|
375
|
-
|
491
|
+
To use the middleware in your application you can use the following
|
492
|
+
configuration options:
|
376
493
|
|
377
|
-
|
494
|
+
```
|
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
|
+
```
|
378
499
|
|
379
|
-
|
380
|
-
|
381
|
-
has_many :books, through: :author
|
382
|
-
has_many :subscriptions, through: :books
|
383
|
-
end
|
500
|
+
To change the database selection strategy, pass a custom class to the
|
501
|
+
configuration options:
|
384
502
|
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
503
|
+
```
|
504
|
+
config.active_record.database_selector = { delay: 10.seconds }
|
505
|
+
config.active_record.database_resolver = MyResolver
|
506
|
+
config.active_record.database_resolver_context = MyResolver::MyCookies
|
507
|
+
```
|
390
508
|
|
391
|
-
|
392
|
-
belongs_to :author
|
393
|
-
has_many :subscriptions
|
394
|
-
end
|
509
|
+
*Eileen M. Uchitelle*
|
395
510
|
|
396
|
-
|
397
|
-
belongs_to :book
|
398
|
-
end
|
511
|
+
* MySQL: Support `:size` option to change text and blob size.
|
399
512
|
|
400
|
-
|
513
|
+
*Ryuta Kamizono*
|
401
514
|
|
402
|
-
|
515
|
+
* Make `t.timestamps` with precision by default.
|
403
516
|
|
404
|
-
|
517
|
+
*Ryuta Kamizono*
|
405
518
|
|
406
|
-
If `post` is not persisted, then `post.subscriptions` can be set and used
|
407
|
-
just like it would if `post` were persisted.
|
408
519
|
|
409
|
-
|
520
|
+
## Rails 6.0.0.beta1 (January 18, 2019) ##
|
410
521
|
|
411
|
-
|
522
|
+
* Remove deprecated `#set_state` from the transaction object.
|
412
523
|
|
413
|
-
*
|
414
|
-
The `first(n)` finder now respects the `limit()`, making it consistent
|
415
|
-
with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
|
524
|
+
*Rafael Mendonça França*
|
416
525
|
|
417
|
-
|
526
|
+
* Remove deprecated `#supports_statement_cache?` from the database adapters.
|
418
527
|
|
419
|
-
*
|
528
|
+
*Rafael Mendonça França*
|
420
529
|
|
421
|
-
*
|
422
|
-
SQL queries for association counting.
|
530
|
+
* Remove deprecated `#insert_fixtures` from the database adapters.
|
423
531
|
|
424
|
-
*
|
532
|
+
*Rafael Mendonça França*
|
425
533
|
|
426
|
-
*
|
534
|
+
* Remove deprecated `ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?`.
|
427
535
|
|
428
|
-
*
|
536
|
+
*Rafael Mendonça França*
|
429
537
|
|
430
|
-
*
|
538
|
+
* Do not allow passing the column name to `sum` when a block is passed.
|
431
539
|
|
432
|
-
*
|
540
|
+
*Rafael Mendonça França*
|
433
541
|
|
434
|
-
*
|
542
|
+
* Do not allow passing the column name to `count` when a block is passed.
|
435
543
|
|
436
|
-
*
|
544
|
+
*Rafael Mendonça França*
|
437
545
|
|
438
|
-
*
|
439
|
-
information.
|
546
|
+
* Remove delegation of missing methods in a relation to arel.
|
440
547
|
|
441
|
-
*
|
548
|
+
*Rafael Mendonça França*
|
442
549
|
|
443
|
-
*
|
550
|
+
* Remove delegation of missing methods in a relation to private methods of the class.
|
444
551
|
|
445
|
-
|
446
|
-
of database queries in the log to facilitate N+1 query resolution
|
447
|
-
and other debugging.
|
552
|
+
*Rafael Mendonça França*
|
448
553
|
|
449
|
-
|
450
|
-
recommended for use in the production environment since it relies
|
451
|
-
on Ruby's `Kernel#caller_locations` which is fairly slow.
|
554
|
+
* Deprecate `config.active_record.sqlite3.represent_boolean_as_integer`.
|
452
555
|
|
453
|
-
*
|
556
|
+
*Rafael Mendonça França*
|
454
557
|
|
455
|
-
*
|
558
|
+
* Change `SQLite3Adapter` to always represent boolean values as integers.
|
456
559
|
|
457
|
-
|
458
|
-
# create_table :posts do |t|
|
459
|
-
# t.integer :comments_count, default: 0
|
460
|
-
# t.integer :lock_version
|
461
|
-
# t.timestamps
|
462
|
-
# end
|
463
|
-
class Post < ApplicationRecord
|
464
|
-
end
|
560
|
+
*Rafael Mendonça França*
|
465
561
|
|
466
|
-
|
467
|
-
# t.belongs_to :post
|
468
|
-
# end
|
469
|
-
class Comment < ApplicationRecord
|
470
|
-
belongs_to :post, touch: true, counter_cache: true
|
471
|
-
end
|
472
|
-
```
|
562
|
+
* Remove ability to specify a timestamp name for `#cache_key`.
|
473
563
|
|
474
|
-
|
475
|
-
```
|
476
|
-
post = Post.create!
|
477
|
-
# => begin transaction
|
478
|
-
INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
|
479
|
-
VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
|
480
|
-
commit transaction
|
564
|
+
*Rafael Mendonça França*
|
481
565
|
|
482
|
-
|
483
|
-
# => begin transaction
|
484
|
-
INSERT INTO "comments" ("post_id") VALUES (1)
|
566
|
+
* Remove deprecated `ActiveRecord::Migrator.migrations_path=`.
|
485
567
|
|
486
|
-
|
487
|
-
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
568
|
+
*Rafael Mendonça França*
|
488
569
|
|
489
|
-
|
490
|
-
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
491
|
-
rollback transaction
|
492
|
-
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
570
|
+
* Remove deprecated `expand_hash_conditions_for_aggregates`.
|
493
571
|
|
494
|
-
|
495
|
-
# => begin transaction
|
496
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
572
|
+
*Rafael Mendonça França*
|
497
573
|
|
498
|
-
|
499
|
-
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
574
|
+
* Set polymorphic type column to NULL on `dependent: :nullify` strategy.
|
500
575
|
|
501
|
-
|
502
|
-
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
503
|
-
rollback transaction
|
504
|
-
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
505
|
-
```
|
576
|
+
On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.
|
506
577
|
|
507
|
-
|
508
|
-
```
|
509
|
-
post = Post.create!
|
510
|
-
# => begin transaction
|
511
|
-
INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
|
512
|
-
VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
|
513
|
-
commit transaction
|
578
|
+
*Laerti Papa*
|
514
579
|
|
515
|
-
|
516
|
-
# => begin transaction
|
517
|
-
INSERT INTO "comments" ("post_id") VALUES (1)
|
580
|
+
* Allow permitted instance of `ActionController::Parameters` as argument of `ActiveRecord::Relation#exists?`.
|
518
581
|
|
519
|
-
|
520
|
-
"lock_version" = COALESCE("lock_version", 0) + 1,
|
521
|
-
"updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
|
522
|
-
commit transaction
|
582
|
+
*Gannon McGibbon*
|
523
583
|
|
524
|
-
|
525
|
-
# => begin transaction
|
526
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
584
|
+
* Add support for endless ranges introduces in Ruby 2.6.
|
527
585
|
|
528
|
-
|
529
|
-
"lock_version" = COALESCE("lock_version", 0) + 1,
|
530
|
-
"updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
|
531
|
-
commit transaction
|
532
|
-
```
|
586
|
+
*Greg Navis*
|
533
587
|
|
534
|
-
|
588
|
+
* Deprecate passing `migrations_paths` to `connection.assume_migrated_upto_version`.
|
535
589
|
|
536
|
-
*
|
590
|
+
*Ryuta Kamizono*
|
537
591
|
|
538
|
-
*
|
592
|
+
* MySQL: `ROW_FORMAT=DYNAMIC` create table option by default.
|
539
593
|
|
540
|
-
|
594
|
+
Since MySQL 5.7.9, the `innodb_default_row_format` option defines the default row
|
595
|
+
format for InnoDB tables. The default setting is `DYNAMIC`.
|
596
|
+
The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
|
541
597
|
|
542
|
-
|
598
|
+
*Ryuta Kamizono*
|
543
599
|
|
544
|
-
|
600
|
+
* Fix join table column quoting with SQLite.
|
545
601
|
|
546
|
-
*
|
602
|
+
*Gannon McGibbon*
|
547
603
|
|
548
|
-
|
604
|
+
* Allow disabling scopes generated by `ActiveRecord.enum`.
|
549
605
|
|
550
|
-
*
|
606
|
+
*Alfred Dominic*
|
551
607
|
|
552
|
-
*
|
553
|
-
when canceling statement due to user request.
|
608
|
+
* Ensure that `delete_all` on collection proxy returns affected count.
|
554
609
|
|
555
610
|
*Ryuta Kamizono*
|
556
611
|
|
557
|
-
*
|
558
|
-
migrating up, e.g. populating a new column.
|
612
|
+
* Reset scope after delete on collection association to clear stale offsets of removed records.
|
559
613
|
|
560
|
-
*
|
614
|
+
*Gannon McGibbon*
|
561
615
|
|
562
|
-
*
|
563
|
-
relation query methods.
|
616
|
+
* Add the ability to prevent writes to a database for the duration of a block.
|
564
617
|
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
```
|
618
|
+
Allows the application to prevent writes to a database. This can be useful when
|
619
|
+
you're building out multiple databases and want to make sure you're not sending
|
620
|
+
writes when you want a read.
|
569
621
|
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
```
|
622
|
+
If `while_preventing_writes` is called and the query is considered a write
|
623
|
+
query the database will raise an exception regardless of whether the database
|
624
|
+
user is able to write.
|
574
625
|
|
575
|
-
This
|
576
|
-
|
577
|
-
|
626
|
+
This is not meant to be a catch-all for write queries but rather a way to enforce
|
627
|
+
read-only queries without opening a second connection. One purpose of this is to
|
628
|
+
catch accidental writes, not all writes.
|
578
629
|
|
579
|
-
|
580
|
-
become an UnknownAttributeReference error in Rails 6.0. Applications
|
581
|
-
can opt in to the future behavior by setting `allow_unsafe_raw_sql`
|
582
|
-
to `:disabled`.
|
630
|
+
*Eileen M. Uchitelle*
|
583
631
|
|
584
|
-
|
585
|
-
references) are unaffected:
|
586
|
-
```
|
587
|
-
Article.order("title DESC")
|
588
|
-
```
|
632
|
+
* Allow aliased attributes to be used in `#update_columns` and `#update`.
|
589
633
|
|
590
|
-
*
|
634
|
+
*Gannon McGibbon*
|
591
635
|
|
592
|
-
*
|
593
|
-
`Type#serialize`. This means that `update_all(foo: 'true')` will properly
|
594
|
-
persist a boolean.
|
636
|
+
* Allow spaces in postgres table names.
|
595
637
|
|
596
|
-
|
638
|
+
Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.
|
597
639
|
|
598
|
-
*
|
599
|
-
when statement timeout exceeded.
|
640
|
+
*Gannon McGibbon*
|
600
641
|
|
601
|
-
|
642
|
+
* Cached `columns_hash` fields should be excluded from `ResultSet#column_types`.
|
602
643
|
|
603
|
-
|
604
|
-
|
605
|
-
Check a format of `VERSION`: Allow a migration version number
|
606
|
-
or name of a migration file. Raise error if format of `VERSION` is invalid.
|
607
|
-
Raise error if target migration doesn't exist.
|
644
|
+
PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
|
645
|
+
was passing for SQLite and MySQL, but failed for PostgreSQL:
|
608
646
|
|
609
|
-
|
647
|
+
```ruby
|
648
|
+
class DeveloperName < ActiveRecord::Type::String
|
649
|
+
def deserialize(value)
|
650
|
+
"Developer: #{value}"
|
651
|
+
end
|
652
|
+
end
|
610
653
|
|
611
|
-
|
612
|
-
|
654
|
+
class AttributedDeveloper < ActiveRecord::Base
|
655
|
+
self.table_name = "developers"
|
613
656
|
|
614
|
-
|
657
|
+
attribute :name, DeveloperName.new
|
615
658
|
|
616
|
-
|
659
|
+
self.ignored_columns += ["name"]
|
660
|
+
end
|
617
661
|
|
618
|
-
|
662
|
+
developer = AttributedDeveloper.create
|
663
|
+
developer.update_column :name, "name"
|
619
664
|
|
620
|
-
|
665
|
+
loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
|
666
|
+
puts loaded_developer.name # should be "Developer: name" but it's just "name"
|
667
|
+
```
|
621
668
|
|
622
|
-
*
|
669
|
+
*Dmitry Tsepelev*
|
623
670
|
|
624
|
-
|
671
|
+
* Make the implicit order column configurable.
|
625
672
|
|
626
|
-
|
673
|
+
When calling ordered finder methods such as `first` or `last` without an
|
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.
|
627
679
|
|
628
|
-
|
680
|
+
Example:
|
629
681
|
|
630
|
-
|
682
|
+
class Project < ActiveRecord::Base
|
683
|
+
self.implicit_order_column = "created_at"
|
684
|
+
end
|
631
685
|
|
632
|
-
*
|
686
|
+
*Tekin Suleyman*
|
633
687
|
|
634
|
-
*
|
688
|
+
* Bump minimum PostgreSQL version to 9.3.
|
635
689
|
|
636
|
-
*
|
690
|
+
*Yasuo Honda*
|
637
691
|
|
638
|
-
*
|
692
|
+
* Values of enum are frozen, raising an error when attempting to modify them.
|
639
693
|
|
640
|
-
*
|
694
|
+
*Emmanuel Byrd*
|
641
695
|
|
642
|
-
*
|
696
|
+
* Move `ActiveRecord::StatementInvalid` SQL to error property and include binds as separate error property.
|
643
697
|
|
644
|
-
|
698
|
+
`ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class` now requires `binds` to be passed as the last argument.
|
645
699
|
|
646
|
-
|
700
|
+
`ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception` now requires `message`, `sql`, and `binds` to be passed as keyword arguments.
|
647
701
|
|
648
|
-
|
702
|
+
Subclasses of `ActiveRecord::StatementInvalid` must now provide `sql:` and `binds:` arguments to `super`.
|
649
703
|
|
650
|
-
|
704
|
+
Example:
|
651
705
|
|
652
|
-
|
706
|
+
```
|
707
|
+
class MySubclassedError < ActiveRecord::StatementInvalid
|
708
|
+
def initialize(message, sql:, binds:)
|
709
|
+
super(message, sql: sql, binds: binds)
|
710
|
+
end
|
711
|
+
end
|
712
|
+
```
|
653
713
|
|
654
|
-
*
|
714
|
+
*Gannon McGibbon*
|
655
715
|
|
656
|
-
|
716
|
+
* Add an `:if_not_exists` option to `create_table`.
|
657
717
|
|
658
|
-
|
718
|
+
Example:
|
659
719
|
|
660
|
-
|
720
|
+
create_table :posts, if_not_exists: true do |t|
|
721
|
+
t.string :title
|
722
|
+
end
|
661
723
|
|
662
|
-
|
724
|
+
That would execute:
|
663
725
|
|
664
|
-
|
726
|
+
CREATE TABLE IF NOT EXISTS posts (
|
727
|
+
...
|
728
|
+
)
|
665
729
|
|
666
|
-
|
730
|
+
If the table already exists, `if_not_exists: false` (the default) raises an
|
731
|
+
exception whereas `if_not_exists: true` does nothing.
|
667
732
|
|
668
|
-
*
|
733
|
+
*fatkodima*, *Stefan Kanev*
|
669
734
|
|
670
|
-
*
|
671
|
-
ar_internal_metadata's data for a test database.
|
735
|
+
* Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an `ArgumentError`.
|
672
736
|
|
673
|
-
|
674
|
-
```
|
675
|
-
$ RAILS_ENV=test rails dbconsole
|
676
|
-
> SELECT * FROM ar_internal_metadata;
|
677
|
-
key|value|created_at|updated_at
|
678
|
-
environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
|
679
|
-
```
|
737
|
+
*Christophe Maximin*
|
680
738
|
|
681
|
-
|
682
|
-
```
|
683
|
-
$ RAILS_ENV=test rails dbconsole
|
684
|
-
> SELECT * FROM ar_internal_metadata;
|
685
|
-
key|value|created_at|updated_at
|
686
|
-
environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
|
687
|
-
```
|
739
|
+
* Adds support for multiple databases to `rails db:schema:cache:dump` and `rails db:schema:cache:clear`.
|
688
740
|
|
689
|
-
|
741
|
+
*Gannon McGibbon*
|
690
742
|
|
691
|
-
|
743
|
+
* `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
|
744
|
+
if the attribute does not exist.
|
692
745
|
|
693
|
-
*
|
746
|
+
*Sean Griffin*
|
694
747
|
|
695
|
-
|
748
|
+
* Add support for hash and URL configs in database hash of `ActiveRecord::Base.connected_to`.
|
696
749
|
|
697
|
-
|
750
|
+
````
|
751
|
+
User.connected_to(database: { writing: "postgres://foo" }) do
|
752
|
+
User.create!(name: "Gannon")
|
753
|
+
end
|
698
754
|
|
699
|
-
|
755
|
+
config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
|
756
|
+
User.connected_to(database: { reading: config }) do
|
757
|
+
User.count
|
758
|
+
end
|
759
|
+
````
|
700
760
|
|
701
|
-
|
761
|
+
*Gannon McGibbon*
|
702
762
|
|
703
|
-
|
763
|
+
* Support default expression for MySQL.
|
704
764
|
|
705
|
-
|
765
|
+
MySQL 8.0.13 and higher supports default value to be a function or expression.
|
706
766
|
|
707
|
-
|
767
|
+
https://dev.mysql.com/doc/refman/8.0/en/create-table.html
|
708
768
|
|
709
769
|
*Ryuta Kamizono*
|
710
770
|
|
711
|
-
*
|
771
|
+
* Support expression indexes for MySQL.
|
712
772
|
|
713
|
-
|
714
|
-
|
715
|
-
`PostgreSQL::OID::Range` was incomplete, because it did not properly
|
716
|
-
cast the bounds that make up the range. This led to subseconds being
|
717
|
-
dropped in SQL commands:
|
773
|
+
MySQL 8.0.13 and higher supports functional key parts that index
|
774
|
+
expression values rather than column or column prefix values.
|
718
775
|
|
719
|
-
|
776
|
+
https://dev.mysql.com/doc/refman/8.0/en/create-index.html
|
720
777
|
|
721
|
-
|
722
|
-
# => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
|
778
|
+
*Ryuta Kamizono*
|
723
779
|
|
724
|
-
|
780
|
+
* Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
|
725
781
|
|
726
|
-
|
727
|
-
# => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
|
782
|
+
Fixes #33056.
|
728
783
|
|
729
|
-
*
|
784
|
+
*Federico Martinez*
|
730
785
|
|
731
|
-
*
|
732
|
-
array.
|
786
|
+
* Add basic API for connection switching to support multiple databases.
|
733
787
|
|
734
|
-
|
788
|
+
1) Adds a `connects_to` method for models to connect to multiple databases. Example:
|
735
789
|
|
736
|
-
|
790
|
+
```
|
791
|
+
class AnimalsModel < ApplicationRecord
|
792
|
+
self.abstract_class = true
|
737
793
|
|
738
|
-
|
794
|
+
connects_to database: { writing: :animals_primary, reading: :animals_replica }
|
795
|
+
end
|
739
796
|
|
740
|
-
|
797
|
+
class Dog < AnimalsModel
|
798
|
+
# connected to both the animals_primary db for writing and the animals_replica for reading
|
799
|
+
end
|
800
|
+
```
|
741
801
|
|
742
|
-
|
743
|
-
|
802
|
+
2) Adds a `connected_to` block method for switching connection roles or connecting to
|
803
|
+
a database that the model didn't connect to. Connecting to the database in this block is
|
804
|
+
useful when you have another defined connection, for example `slow_replica` that you don't
|
805
|
+
want to connect to by default but need in the console, or a specific code block.
|
744
806
|
|
745
|
-
|
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
|
+
```
|
746
813
|
|
747
|
-
|
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
|
+
```
|
748
819
|
|
749
|
-
*
|
750
|
-
when lock wait timeout exceeded.
|
820
|
+
*Eileen M. Uchitelle*
|
751
821
|
|
752
|
-
|
822
|
+
* Enum raises on invalid definition values
|
753
823
|
|
754
|
-
|
824
|
+
When defining a Hash enum it can be easy to use `[]` instead of `{}`. This
|
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`.
|
755
828
|
|
756
|
-
|
829
|
+
Fixes #33961
|
757
830
|
|
758
|
-
*
|
831
|
+
*Alberto Almagro*
|
759
832
|
|
760
|
-
|
833
|
+
* Reloading associations now clears the Query Cache like `Persistence#reload` does.
|
761
834
|
|
762
|
-
|
835
|
+
```
|
836
|
+
class Post < ActiveRecord::Base
|
837
|
+
has_one :category
|
838
|
+
belongs_to :author
|
839
|
+
has_many :comments
|
840
|
+
end
|
763
841
|
|
764
|
-
|
842
|
+
# Each of the following will now clear the query cache.
|
843
|
+
post.reload_category
|
844
|
+
post.reload_author
|
845
|
+
post.comments.reload
|
846
|
+
```
|
765
847
|
|
766
|
-
*
|
848
|
+
*Christophe Maximin*
|
767
849
|
|
768
|
-
*
|
850
|
+
* Added `index` option for `change_table` migration helpers.
|
851
|
+
With this change you can create indexes while adding new
|
852
|
+
columns into the existing tables.
|
769
853
|
|
770
|
-
|
854
|
+
Example:
|
771
855
|
|
772
|
-
|
856
|
+
change_table(:languages) do |t|
|
857
|
+
t.string :country_code, index: true
|
858
|
+
end
|
773
859
|
|
774
|
-
*
|
860
|
+
*Mehmet Emin İNAÇ*
|
775
861
|
|
776
|
-
* `
|
777
|
-
`references` only, as `references` can be implicitly called by `where`.
|
862
|
+
* Fix `transaction` reverting for migrations.
|
778
863
|
|
779
|
-
|
864
|
+
Before: Commands inside a `transaction` in a reverted migration ran uninverted.
|
865
|
+
Now: This change fixes that by reverting commands inside `transaction` block.
|
780
866
|
|
781
|
-
*
|
867
|
+
*fatkodima*, *David Verhasselt*
|
782
868
|
|
783
|
-
*
|
784
|
-
need to generate it, it can be created with `rails g application_record`.
|
869
|
+
* Raise an error instead of scanning the filesystem root when `fixture_path` is blank.
|
785
870
|
|
786
|
-
*
|
871
|
+
*Gannon McGibbon*, *Max Albrecht*
|
787
872
|
|
788
|
-
*
|
873
|
+
* Allow `ActiveRecord::Base.configurations=` to be set with a symbolized hash.
|
789
874
|
|
790
|
-
*
|
875
|
+
*Gannon McGibbon*
|
791
876
|
|
792
|
-
*
|
793
|
-
`destroyed_by_association` will now be set to the reflection, matching the
|
794
|
-
behaviour of `has_many` associations.
|
877
|
+
* Don't update counter cache unless the record is actually saved.
|
795
878
|
|
796
|
-
|
879
|
+
Fixes #31493, #33113, #33117.
|
797
880
|
|
798
|
-
*
|
881
|
+
*Ryuta Kamizono*
|
882
|
+
|
883
|
+
* Deprecate `ActiveRecord::Result#to_hash` in favor of `ActiveRecord::Result#to_a`.
|
884
|
+
|
885
|
+
*Gannon McGibbon*, *Kevin Cheng*
|
799
886
|
|
800
|
-
|
801
|
-
bind values used by the `or` instead. (possibly other cases too)
|
887
|
+
* SQLite3 adapter supports expression indexes.
|
802
888
|
|
803
889
|
```
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
890
|
+
create_table :users do |t|
|
891
|
+
t.string :email
|
892
|
+
end
|
893
|
+
|
894
|
+
add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
|
809
895
|
```
|
810
896
|
|
811
|
-
*
|
897
|
+
*Gray Kemmey*
|
812
898
|
|
813
|
-
*
|
814
|
-
post-type-cast value for rendering in single-field form inputs.
|
899
|
+
* Allow subclasses to redefine autosave callbacks for associated records.
|
815
900
|
|
816
|
-
|
901
|
+
Fixes #33305.
|
817
902
|
|
818
|
-
*
|
819
|
-
`current_scope`, with the exception of `unscoped`.
|
903
|
+
*Andrey Subbota*
|
820
904
|
|
821
|
-
|
905
|
+
* Bump minimum MySQL version to 5.5.8.
|
822
906
|
|
823
|
-
*
|
907
|
+
*Yasuo Honda*
|
824
908
|
|
825
|
-
*
|
909
|
+
* Use MySQL utf8mb4 character set by default.
|
826
910
|
|
827
|
-
|
828
|
-
|
911
|
+
`utf8mb4` character set with 4-Byte encoding supports supplementary characters including emoji.
|
912
|
+
The previous default 3-Byte encoding character set `utf8` is not enough to support them.
|
829
913
|
|
830
|
-
|
831
|
-
for SQLite databases, so it's implemented behind a configuration flag
|
832
|
-
whose default false value is deprecated.
|
914
|
+
*Yasuo Honda*
|
833
915
|
|
834
|
-
|
916
|
+
* Fix duplicated record creation when using nested attributes with `create_with`.
|
835
917
|
|
836
|
-
*
|
837
|
-
`in_batches`).
|
918
|
+
*Darwin Wu*
|
838
919
|
|
839
|
-
|
840
|
-
|
920
|
+
* Configuration item `config.filter_parameters` could also filter out
|
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.
|
841
924
|
|
842
|
-
|
925
|
+
```
|
926
|
+
Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
|
927
|
+
Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
|
928
|
+
SecureAccount.filter_attributes += [:name]
|
929
|
+
SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
|
930
|
+
```
|
843
931
|
|
844
|
-
*
|
845
|
-
`ActiveRecord::StatementInvalid` exceptions.
|
932
|
+
*Zhang Kang*, *Yoshiyuki Kinjo*
|
846
933
|
|
847
|
-
|
934
|
+
* Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
|
935
|
+
`indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
|
936
|
+
and `joins_per_query` methods in `DatabaseLimits`.
|
848
937
|
|
849
|
-
*
|
938
|
+
*Ryuta Kamizono*
|
850
939
|
|
851
|
-
|
940
|
+
* `ActiveRecord::Base.configurations` now returns an object.
|
852
941
|
|
853
|
-
|
942
|
+
`ActiveRecord::Base.configurations` used to return a hash, but this
|
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.
|
854
950
|
|
855
|
-
|
951
|
+
For example, the following `database.yml`:
|
856
952
|
|
857
|
-
|
858
|
-
|
953
|
+
```
|
954
|
+
development:
|
955
|
+
adapter: sqlite3
|
956
|
+
database: db/development.sqlite3
|
957
|
+
```
|
859
958
|
|
860
|
-
|
861
|
-
parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
|
959
|
+
Used to become a hash:
|
862
960
|
|
863
|
-
|
961
|
+
```
|
962
|
+
{ "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
|
963
|
+
```
|
864
964
|
|
865
|
-
|
965
|
+
Is now converted into the following object:
|
866
966
|
|
867
|
-
|
868
|
-
|
869
|
-
|
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
|
+
```
|
870
973
|
|
871
|
-
|
974
|
+
Iterating over the database configurations has also changed. Instead of
|
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.
|
872
980
|
|
873
|
-
|
981
|
+
```
|
982
|
+
ActiveRecord::Base.configurations.configs_for(env_name: "development")
|
983
|
+
ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
|
984
|
+
```
|
874
985
|
|
875
|
-
*
|
986
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
987
|
+
|
988
|
+
* Add database configuration to disable advisory locks.
|
876
989
|
|
877
|
-
|
878
|
-
|
990
|
+
```
|
991
|
+
production:
|
992
|
+
adapter: postgresql
|
993
|
+
advisory_locks: false
|
994
|
+
```
|
879
995
|
|
880
|
-
*
|
996
|
+
*Guo Xiang*
|
881
997
|
|
882
|
-
*
|
883
|
-
if the child records were deleted before the parent was saved, they would
|
884
|
-
still be persisted. Now, if child records are deleted before the parent is saved
|
885
|
-
on a `has_many :through` association, the child records will not be persisted.
|
998
|
+
* SQLite3 adapter `alter_table` method restores foreign keys.
|
886
999
|
|
887
|
-
*
|
1000
|
+
*Yasuo Honda*
|
888
1001
|
|
889
|
-
*
|
890
|
-
the merged relation into LEFT OUTER JOIN.
|
1002
|
+
* Allow `:to_table` option to `invert_remove_foreign_key`.
|
891
1003
|
|
892
1004
|
Example:
|
893
1005
|
|
894
|
-
|
895
|
-
Author.joins(:posts).merge(Post.joins(:comments))
|
896
|
-
# Before the change:
|
897
|
-
#=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
|
1006
|
+
remove_foreign_key :accounts, to_table: :owners
|
898
1007
|
|
899
|
-
|
900
|
-
#=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
|
901
|
-
```
|
1008
|
+
*Nikolay Epifanov*, *Rich Chen*
|
902
1009
|
|
903
|
-
|
1010
|
+
* Add environment & load_config dependency to `bin/rake db:seed` to enable
|
1011
|
+
seed load in environments without Rails and custom DB configuration
|
904
1012
|
|
905
|
-
*
|
906
|
-
`locking_column`, without default value, is null in the database.
|
1013
|
+
*Tobias Bielohlawek*
|
907
1014
|
|
908
|
-
|
1015
|
+
* Fix default value for mysql time types with specified precision.
|
909
1016
|
|
910
|
-
*
|
911
|
-
`locking_column` is null in the database.
|
1017
|
+
*Nikolay Kondratyev*
|
912
1018
|
|
913
|
-
|
1019
|
+
* Fix `touch` option to behave consistently with `Persistence#touch` method.
|
914
1020
|
|
915
|
-
*
|
1021
|
+
*Ryuta Kamizono*
|
916
1022
|
|
917
|
-
|
1023
|
+
* Migrations raise when duplicate column definition.
|
918
1024
|
|
919
|
-
|
1025
|
+
Fixes #33024.
|
920
1026
|
|
921
|
-
*
|
1027
|
+
*Federico Martinez*
|
922
1028
|
|
923
|
-
*
|
1029
|
+
* Bump minimum SQLite version to 3.8
|
924
1030
|
|
925
|
-
*
|
1031
|
+
*Yasuo Honda*
|
926
1032
|
|
927
|
-
*
|
1033
|
+
* Fix parent record should not get saved with duplicate children records.
|
1034
|
+
|
1035
|
+
Fixes #32940.
|
928
1036
|
|
929
|
-
|
1037
|
+
*Santosh Wadghule*
|
930
1038
|
|
931
|
-
|
1039
|
+
* Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
|
932
1040
|
|
933
|
-
*
|
934
|
-
in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
|
935
|
-
that does not include a timestamp any more.
|
1041
|
+
*Brian Durand*
|
936
1042
|
|
937
|
-
|
938
|
-
|
1043
|
+
* Ensure `Associations::CollectionAssociation#size` and `Associations::CollectionAssociation#empty?`
|
1044
|
+
use loaded association ids if present.
|
939
1045
|
|
940
|
-
*
|
1046
|
+
*Graham Turner*
|
941
1047
|
|
942
|
-
*
|
1048
|
+
* Add support to preload associations of polymorphic associations when not all the records have the requested associations.
|
943
1049
|
|
944
|
-
*
|
1050
|
+
*Dana Sherson*
|
945
1051
|
|
946
|
-
* Add
|
1052
|
+
* Add `touch_all` method to `ActiveRecord::Relation`.
|
947
1053
|
|
948
|
-
|
1054
|
+
Example:
|
949
1055
|
|
950
|
-
|
1056
|
+
Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
|
951
1057
|
|
952
|
-
*
|
1058
|
+
*fatkodima*, *duggiefresh*
|
953
1059
|
|
954
|
-
|
1060
|
+
* Add `ActiveRecord::Base.base_class?` predicate.
|
955
1061
|
|
956
|
-
*
|
957
|
-
when the current migration does not exist.
|
1062
|
+
*Bogdan Gusiev*
|
958
1063
|
|
959
|
-
|
1064
|
+
* Add custom prefix/suffix options to `ActiveRecord::Store.store_accessor`.
|
960
1065
|
|
961
|
-
*
|
1066
|
+
*Tan Huynh*, *Yukio Mizuta*
|
962
1067
|
|
963
|
-
|
1068
|
+
* Rails 6 requires Ruby 2.5.0 or newer.
|
964
1069
|
|
965
|
-
*
|
1070
|
+
*Jeremy Daer*, *Kasper Timm Hansen*
|
966
1071
|
|
967
|
-
|
968
|
-
See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
|
1072
|
+
* Deprecate `update_attributes`/`!` in favor of `update`/`!`.
|
969
1073
|
|
970
|
-
*
|
1074
|
+
*Eddie Lebow*
|
971
1075
|
|
972
|
-
*
|
1076
|
+
* Add `ActiveRecord::Base.create_or_find_by`/`!` to deal with the SELECT/INSERT race condition in
|
1077
|
+
`ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
|
973
1078
|
|
974
|
-
*
|
1079
|
+
*DHH*
|
975
1080
|
|
976
|
-
*
|
977
|
-
Previously this method always returned an empty array.
|
1081
|
+
* Add `Relation#pick` as short-hand for single-value plucks.
|
978
1082
|
|
979
|
-
*
|
1083
|
+
*DHH*
|
980
1084
|
|
981
1085
|
|
982
|
-
Please check [5-
|
1086
|
+
Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activerecord/CHANGELOG.md) for previous changes.
|