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