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