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