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