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