activerecord 5.1.7 → 5.2.4.3
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 +556 -685
- data/MIT-LICENSE +1 -1
- data/README.rdoc +5 -5
- data/examples/performance.rb +2 -0
- data/examples/simple.rb +2 -0
- data/lib/active_record.rb +11 -4
- data/lib/active_record/aggregations.rb +6 -5
- data/lib/active_record/association_relation.rb +7 -5
- data/lib/active_record/associations.rb +40 -63
- data/lib/active_record/associations/alias_tracker.rb +19 -27
- data/lib/active_record/associations/association.rb +41 -37
- data/lib/active_record/associations/association_scope.rb +38 -50
- data/lib/active_record/associations/belongs_to_association.rb +27 -8
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -8
- data/lib/active_record/associations/builder/association.rb +4 -7
- data/lib/active_record/associations/builder/belongs_to.rb +12 -4
- data/lib/active_record/associations/builder/collection_association.rb +3 -3
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -1
- data/lib/active_record/associations/builder/has_many.rb +2 -0
- data/lib/active_record/associations/builder/has_one.rb +2 -0
- data/lib/active_record/associations/builder/singular_association.rb +2 -0
- data/lib/active_record/associations/collection_association.rb +59 -47
- data/lib/active_record/associations/collection_proxy.rb +20 -49
- data/lib/active_record/associations/foreign_association.rb +2 -0
- data/lib/active_record/associations/has_many_association.rb +12 -1
- data/lib/active_record/associations/has_many_through_association.rb +36 -30
- data/lib/active_record/associations/has_one_association.rb +12 -1
- data/lib/active_record/associations/has_one_through_association.rb +13 -8
- data/lib/active_record/associations/join_dependency.rb +48 -93
- data/lib/active_record/associations/join_dependency/join_association.rb +39 -63
- data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
- data/lib/active_record/associations/join_dependency/join_part.rb +9 -9
- data/lib/active_record/associations/preloader.rb +18 -38
- data/lib/active_record/associations/preloader/association.rb +45 -61
- data/lib/active_record/associations/preloader/through_association.rb +71 -79
- data/lib/active_record/associations/singular_association.rb +14 -16
- data/lib/active_record/associations/through_association.rb +26 -11
- data/lib/active_record/attribute_assignment.rb +2 -5
- data/lib/active_record/attribute_decorators.rb +3 -2
- data/lib/active_record/attribute_methods.rb +65 -24
- data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
- data/lib/active_record/attribute_methods/dirty.rb +30 -214
- data/lib/active_record/attribute_methods/primary_key.rb +7 -6
- data/lib/active_record/attribute_methods/query.rb +2 -0
- data/lib/active_record/attribute_methods/read.rb +9 -3
- data/lib/active_record/attribute_methods/serialization.rb +23 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +6 -8
- data/lib/active_record/attribute_methods/write.rb +21 -9
- data/lib/active_record/attributes.rb +6 -5
- data/lib/active_record/autosave_association.rb +35 -19
- data/lib/active_record/base.rb +2 -0
- data/lib/active_record/callbacks.rb +8 -6
- data/lib/active_record/coders/json.rb +2 -0
- data/lib/active_record/coders/yaml_column.rb +2 -0
- data/lib/active_record/collection_cache_key.rb +12 -8
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +139 -41
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +174 -33
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +15 -5
- data/lib/active_record/connection_adapters/abstract/quoting.rb +13 -31
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +14 -5
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +64 -6
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +152 -81
- data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -21
- data/lib/active_record/connection_adapters/abstract_adapter.rb +84 -97
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +92 -165
- data/lib/active_record/connection_adapters/column.rb +3 -1
- data/lib/active_record/connection_adapters/connection_specification.rb +17 -3
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +13 -2
- data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +47 -2
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +9 -10
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -3
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +7 -10
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +106 -1
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -2
- data/lib/active_record/connection_adapters/postgresql/column.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -0
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +4 -2
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +18 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +24 -11
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +233 -111
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +57 -73
- data/lib/active_record/connection_adapters/schema_cache.rb +4 -2
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +2 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +6 -15
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -2
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +75 -1
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +81 -94
- data/lib/active_record/connection_adapters/statement_pool.rb +2 -0
- data/lib/active_record/connection_handling.rb +4 -2
- data/lib/active_record/core.rb +41 -61
- data/lib/active_record/counter_cache.rb +10 -3
- data/lib/active_record/define_callbacks.rb +5 -3
- data/lib/active_record/dynamic_matchers.rb +9 -9
- data/lib/active_record/enum.rb +18 -13
- data/lib/active_record/errors.rb +42 -3
- data/lib/active_record/explain.rb +3 -1
- data/lib/active_record/explain_registry.rb +2 -0
- data/lib/active_record/explain_subscriber.rb +2 -0
- data/lib/active_record/fixture_set/file.rb +2 -0
- data/lib/active_record/fixtures.rb +67 -60
- data/lib/active_record/gem_version.rb +5 -3
- data/lib/active_record/inheritance.rb +49 -19
- data/lib/active_record/integration.rb +58 -19
- data/lib/active_record/internal_metadata.rb +2 -0
- data/lib/active_record/legacy_yaml_adapter.rb +3 -1
- data/lib/active_record/locking/optimistic.rb +14 -17
- data/lib/active_record/locking/pessimistic.rb +9 -6
- data/lib/active_record/log_subscriber.rb +43 -0
- data/lib/active_record/migration.rb +189 -139
- data/lib/active_record/migration/command_recorder.rb +11 -9
- data/lib/active_record/migration/compatibility.rb +47 -9
- data/lib/active_record/migration/join_table.rb +2 -0
- data/lib/active_record/model_schema.rb +16 -21
- data/lib/active_record/nested_attributes.rb +18 -6
- data/lib/active_record/no_touching.rb +3 -1
- data/lib/active_record/null_relation.rb +2 -0
- data/lib/active_record/persistence.rb +167 -16
- data/lib/active_record/query_cache.rb +6 -8
- data/lib/active_record/querying.rb +4 -2
- data/lib/active_record/railtie.rb +62 -6
- data/lib/active_record/railties/console_sandbox.rb +2 -0
- data/lib/active_record/railties/controller_runtime.rb +2 -0
- data/lib/active_record/railties/databases.rake +46 -36
- data/lib/active_record/readonly_attributes.rb +3 -2
- data/lib/active_record/reflection.rb +108 -194
- data/lib/active_record/relation.rb +120 -214
- data/lib/active_record/relation/batches.rb +20 -5
- data/lib/active_record/relation/batches/batch_enumerator.rb +2 -0
- data/lib/active_record/relation/calculations.rb +45 -19
- data/lib/active_record/relation/delegation.rb +45 -27
- data/lib/active_record/relation/finder_methods.rb +75 -76
- data/lib/active_record/relation/from_clause.rb +2 -8
- data/lib/active_record/relation/merger.rb +53 -23
- data/lib/active_record/relation/predicate_builder.rb +60 -79
- data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -7
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +2 -2
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +12 -1
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +56 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +26 -9
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
- data/lib/active_record/relation/query_attribute.rb +28 -2
- data/lib/active_record/relation/query_methods.rb +128 -99
- data/lib/active_record/relation/record_fetch_warning.rb +2 -0
- data/lib/active_record/relation/spawn_methods.rb +4 -2
- data/lib/active_record/relation/where_clause.rb +65 -68
- data/lib/active_record/relation/where_clause_factory.rb +5 -48
- data/lib/active_record/result.rb +2 -0
- data/lib/active_record/runtime_registry.rb +2 -0
- data/lib/active_record/sanitization.rb +129 -121
- data/lib/active_record/schema.rb +4 -2
- data/lib/active_record/schema_dumper.rb +36 -26
- data/lib/active_record/schema_migration.rb +2 -0
- data/lib/active_record/scoping.rb +9 -8
- data/lib/active_record/scoping/default.rb +8 -9
- data/lib/active_record/scoping/named.rb +23 -7
- data/lib/active_record/secure_token.rb +2 -0
- data/lib/active_record/serialization.rb +2 -0
- data/lib/active_record/statement_cache.rb +23 -13
- data/lib/active_record/store.rb +3 -1
- data/lib/active_record/suppressor.rb +2 -0
- data/lib/active_record/table_metadata.rb +12 -3
- data/lib/active_record/tasks/database_tasks.rb +25 -14
- data/lib/active_record/tasks/mysql_database_tasks.rb +9 -48
- data/lib/active_record/tasks/postgresql_database_tasks.rb +10 -2
- data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -3
- data/lib/active_record/timestamp.rb +6 -6
- data/lib/active_record/touch_later.rb +2 -0
- data/lib/active_record/transactions.rb +33 -28
- data/lib/active_record/translation.rb +2 -0
- data/lib/active_record/type.rb +4 -1
- data/lib/active_record/type/adapter_specific_registry.rb +2 -0
- data/lib/active_record/type/date.rb +2 -0
- data/lib/active_record/type/date_time.rb +2 -0
- data/lib/active_record/type/decimal_without_scale.rb +2 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +2 -0
- data/lib/active_record/type/internal/timezone.rb +2 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +2 -0
- data/lib/active_record/type/text.rb +2 -0
- data/lib/active_record/type/time.rb +2 -0
- data/lib/active_record/type/type_map.rb +2 -0
- data/lib/active_record/type/unsigned_integer.rb +2 -0
- data/lib/active_record/type_caster.rb +2 -0
- data/lib/active_record/type_caster/connection.rb +2 -0
- data/lib/active_record/type_caster/map.rb +3 -1
- data/lib/active_record/validations.rb +2 -0
- data/lib/active_record/validations/absence.rb +2 -0
- data/lib/active_record/validations/associated.rb +2 -0
- data/lib/active_record/validations/length.rb +2 -0
- data/lib/active_record/validations/presence.rb +2 -0
- data/lib/active_record/validations/uniqueness.rb +35 -5
- data/lib/active_record/version.rb +2 -0
- data/lib/rails/generators/active_record.rb +3 -1
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
- data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration.rb +2 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -1
- data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +0 -0
- data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +0 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +2 -23
- data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +0 -0
- data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
- metadata +23 -36
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -15
- data/lib/active_record/associations/preloader/collection_association.rb +0 -17
- data/lib/active_record/associations/preloader/has_many.rb +0 -15
- data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
- data/lib/active_record/associations/preloader/has_one.rb +0 -15
- data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
- data/lib/active_record/associations/preloader/singular_association.rb +0 -18
- data/lib/active_record/attribute.rb +0 -240
- data/lib/active_record/attribute/user_provided_default.rb +0 -30
- data/lib/active_record/attribute_mutation_tracker.rb +0 -122
- data/lib/active_record/attribute_set.rb +0 -113
- data/lib/active_record/attribute_set/builder.rb +0 -126
- data/lib/active_record/attribute_set/yaml_encoder.rb +0 -41
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -10
- data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -59
- data/lib/active_record/type/internal/abstract_json.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53026adc50898a819677e9b8e756dce17b86381169f06e113b0a4b61de1b4a0d
|
4
|
+
data.tar.gz: fbcb8489afc63ab946993ca9c4cea9bcbb72091cf8b0c773dd2365db186f1257
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae5d30ec10516842e67813496fd04e81e5c284551d0a25ff9051c1801ad34350b43c6a6b810e23c11a01e5a2c4e74019de9e7c177a8144ea607c05b8c855b9c4
|
7
|
+
data.tar.gz: 6ed32251132d5c3464f8829656e5865e0424949e498ebdbed1490b664562b4cabe3788d07b11c5af152d2e814d1b9197b4d76180c7c8b5b393d0f4468a11f58f
|
data/CHANGELOG.md
CHANGED
@@ -1,1116 +1,987 @@
|
|
1
|
-
## Rails 5.
|
2
|
-
|
3
|
-
* Fix `touch` option to behave consistently with `Persistence#touch` method.
|
4
|
-
|
5
|
-
*Ryuta Kamizono*
|
6
|
-
|
7
|
-
* Back port Rails 5.2 `reverse_order` Arel SQL literal fix.
|
8
|
-
|
9
|
-
*Matt Jones*, *Brooke Kuhlmann*
|
10
|
-
|
11
|
-
* `becomes` should clear the mutation tracker which is created in `after_initialize`.
|
12
|
-
|
13
|
-
Fixes #32867.
|
14
|
-
|
15
|
-
*Ryuta Kamizono*
|
16
|
-
|
17
|
-
|
18
|
-
## Rails 5.1.6.2 (March 11, 2019) ##
|
1
|
+
## Rails 5.2.4.3 (May 18, 2020) ##
|
19
2
|
|
20
3
|
* No changes.
|
21
4
|
|
22
5
|
|
23
|
-
## Rails 5.
|
6
|
+
## Rails 5.2.4.1 (December 18, 2019) ##
|
24
7
|
|
25
8
|
* No changes.
|
26
9
|
|
27
10
|
|
28
|
-
## Rails 5.
|
11
|
+
## Rails 5.2.4 (November 27, 2019) ##
|
29
12
|
|
30
|
-
*
|
13
|
+
* Fix circular `autosave: true` causes invalid records to be saved.
|
31
14
|
|
32
|
-
|
15
|
+
Prior to the fix, when there was a circular series of `autosave: true`
|
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`.
|
33
22
|
|
34
|
-
|
35
|
-
|
36
|
-
PR #20317 changed the behavior of datetime columns so that when they
|
37
|
-
have a specified precision then on assignment the value is rounded to
|
38
|
-
that precision. This behavior is now applied to time columns as well.
|
23
|
+
Fixes #28080.
|
39
24
|
|
40
|
-
|
25
|
+
*Larry Reid*
|
41
26
|
|
42
|
-
|
27
|
+
* PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
|
43
28
|
|
44
|
-
|
45
|
-
|
46
|
-
For legacy reasons, time columns in SQLite are stored as full datetimes
|
47
|
-
because until #24542 the quoting for time columns didn't remove the date
|
48
|
-
component. To ensure that values are consistent we now normalize the
|
49
|
-
date component to 2001-01-01 on reading and writing.
|
50
|
-
|
51
|
-
*Andrew White*
|
29
|
+
Fixes #36022.
|
52
30
|
|
53
|
-
*
|
31
|
+
*Ryuta Kamizono*
|
54
32
|
|
55
|
-
|
56
|
-
was removed however it only removed it when it was 2001-01-01. Now the
|
57
|
-
date component is removed irrespective of what the date is.
|
33
|
+
* Fix sqlite3 collation parsing when using decimal columns.
|
58
34
|
|
59
|
-
*
|
35
|
+
*Martin R. Schuster*
|
60
36
|
|
61
|
-
*
|
37
|
+
* Make ActiveRecord `ConnectionPool.connections` method thread-safe.
|
62
38
|
|
63
|
-
|
39
|
+
Fixes #36465.
|
64
40
|
|
65
|
-
*
|
66
|
-
`locking_column`, without default value, is null in the database.
|
41
|
+
*Jeff Doering*
|
67
42
|
|
68
|
-
|
43
|
+
* Assign all attributes before calling `build` to ensure the child record is visible in
|
44
|
+
`before_add` and `after_add` callbacks for `has_many :through` associations.
|
69
45
|
|
70
|
-
|
71
|
-
`locking column` is null in the database.
|
46
|
+
Fixes #33249.
|
72
47
|
|
73
|
-
*
|
48
|
+
*Ryan H. Kerr*
|
74
49
|
|
75
50
|
|
76
|
-
## Rails 5.
|
51
|
+
## Rails 5.2.3 (March 27, 2019) ##
|
77
52
|
|
78
|
-
*
|
53
|
+
* Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
|
79
54
|
|
80
|
-
|
55
|
+
Fixes #35214.
|
81
56
|
|
82
|
-
*
|
57
|
+
*Juani Villarejo*
|
83
58
|
|
84
|
-
|
59
|
+
* Fix prepared statements caching to be enabled even when query caching is enabled.
|
85
60
|
|
86
61
|
*Ryuta Kamizono*
|
87
62
|
|
88
|
-
*
|
89
|
-
SQL queries for association counting.
|
63
|
+
* Don't allow `where` with invalid value matches to nil values.
|
90
64
|
|
91
|
-
|
65
|
+
Fixes #33624.
|
92
66
|
|
93
|
-
*
|
67
|
+
*Ryuta Kamizono*
|
94
68
|
|
95
|
-
|
69
|
+
* Restore an ability that class level `update` without giving ids.
|
96
70
|
|
97
|
-
|
71
|
+
Fixes #34743.
|
98
72
|
|
99
73
|
*Ryuta Kamizono*
|
100
74
|
|
101
|
-
* Fix
|
75
|
+
* Fix join table column quoting with SQLite.
|
102
76
|
|
103
|
-
|
104
|
-
# create_table :posts do |t|
|
105
|
-
# t.integer :comments_count, default: 0
|
106
|
-
# t.integer :lock_version
|
107
|
-
# t.timestamps
|
108
|
-
# end
|
109
|
-
class Post < ApplicationRecord
|
110
|
-
end
|
77
|
+
*Gannon McGibbon*
|
111
78
|
|
112
|
-
|
113
|
-
# t.belongs_to :post
|
114
|
-
# end
|
115
|
-
class Comment < ApplicationRecord
|
116
|
-
belongs_to :post, touch: true, counter_cache: true
|
117
|
-
end
|
118
|
-
```
|
79
|
+
* Ensure that `delete_all` on collection proxy returns affected count.
|
119
80
|
|
120
|
-
|
121
|
-
```
|
122
|
-
post = Post.create!
|
123
|
-
# => begin transaction
|
124
|
-
INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
|
125
|
-
VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
|
126
|
-
commit transaction
|
81
|
+
*Ryuta Kamizono*
|
127
82
|
|
128
|
-
|
129
|
-
# => begin transaction
|
130
|
-
INSERT INTO "comments" ("post_id") VALUES (1)
|
83
|
+
* Reset scope after delete on collection association to clear stale offsets of removed records.
|
131
84
|
|
132
|
-
|
133
|
-
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
85
|
+
*Gannon McGibbon*
|
134
86
|
|
135
|
-
UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
|
136
|
-
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
137
|
-
rollback transaction
|
138
|
-
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
139
87
|
|
140
|
-
|
141
|
-
# => begin transaction
|
142
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
88
|
+
## Rails 5.2.2.1 (March 11, 2019) ##
|
143
89
|
|
144
|
-
|
145
|
-
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
90
|
+
* No changes.
|
146
91
|
|
147
|
-
UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
|
148
|
-
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
149
|
-
rollback transaction
|
150
|
-
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
151
|
-
```
|
152
92
|
|
153
|
-
|
154
|
-
```
|
155
|
-
post = Post.create!
|
156
|
-
# => begin transaction
|
157
|
-
INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
|
158
|
-
VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
|
159
|
-
commit transaction
|
93
|
+
## Rails 5.2.2 (December 04, 2018) ##
|
160
94
|
|
161
|
-
|
162
|
-
# => begin transaction
|
163
|
-
INSERT INTO "comments" ("post_id") VALUES (1)
|
95
|
+
* Do not ignore the scoping with query methods in the scope block.
|
164
96
|
|
165
|
-
|
166
|
-
"lock_version" = COALESCE("lock_version", 0) + 1,
|
167
|
-
"updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
|
168
|
-
commit transaction
|
97
|
+
*Ryuta Kamizono*
|
169
98
|
|
170
|
-
|
171
|
-
# => begin transaction
|
172
|
-
DELETE FROM "comments" WHERE "comments"."id" = 1
|
99
|
+
* Allow aliased attributes to be used in `#update_columns` and `#update`.
|
173
100
|
|
174
|
-
|
175
|
-
"lock_version" = COALESCE("lock_version", 0) + 1,
|
176
|
-
"updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
|
177
|
-
commit transaction
|
178
|
-
```
|
101
|
+
*Gannon McGibbon*
|
179
102
|
|
180
|
-
|
103
|
+
* Allow spaces in postgres table names.
|
181
104
|
|
182
|
-
|
105
|
+
Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres
|
106
|
+
adapter.
|
183
107
|
|
184
|
-
*
|
185
|
-
without being connected.
|
108
|
+
*Gannon McGibbon*
|
186
109
|
|
187
|
-
|
110
|
+
* Cached columns_hash fields should be excluded from ResultSet#column_types
|
188
111
|
|
189
|
-
|
190
|
-
|
112
|
+
PR #34528 addresses the inconsistent behaviour when attribute is defined for an ignored column. The following test
|
113
|
+
was passing for SQLite and MySQL, but failed for PostgreSQL:
|
191
114
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
```
|
115
|
+
```ruby
|
116
|
+
class DeveloperName < ActiveRecord::Type::String
|
117
|
+
def deserialize(value)
|
118
|
+
"Developer: #{value}"
|
119
|
+
end
|
120
|
+
end
|
199
121
|
|
200
|
-
|
201
|
-
|
202
|
-
$ RAILS_ENV=test rails dbconsole
|
203
|
-
> SELECT * FROM ar_internal_metadata;
|
204
|
-
key|value|created_at|updated_at
|
205
|
-
environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
|
206
|
-
```
|
122
|
+
class AttributedDeveloper < ActiveRecord::Base
|
123
|
+
self.table_name = "developers"
|
207
124
|
|
208
|
-
|
125
|
+
attribute :name, DeveloperName.new
|
209
126
|
|
210
|
-
|
127
|
+
self.ignored_columns += ["name"]
|
128
|
+
end
|
211
129
|
|
212
|
-
|
130
|
+
developer = AttributedDeveloper.create
|
131
|
+
developer.update_column :name, "name"
|
213
132
|
|
214
|
-
|
133
|
+
loaded_developer = AttributedDeveloper.where(id: developer.id).select("*").first
|
134
|
+
puts loaded_developer.name # should be "Developer: name" but it's just "name"
|
135
|
+
```
|
215
136
|
|
216
|
-
*
|
137
|
+
*Dmitry Tsepelev*
|
217
138
|
|
218
|
-
*
|
139
|
+
* Values of enum are frozen, raising an error when attempting to modify them.
|
219
140
|
|
220
|
-
|
141
|
+
*Emmanuel Byrd*
|
221
142
|
|
222
|
-
|
143
|
+
* `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
|
144
|
+
if the attribute does not exist.
|
223
145
|
|
224
|
-
*
|
146
|
+
*Sean Griffin*
|
225
147
|
|
226
|
-
|
148
|
+
* Do not use prepared statement in queries that have a large number of binds.
|
227
149
|
|
228
150
|
*Ryuta Kamizono*
|
229
151
|
|
152
|
+
* Fix query cache to load before first request.
|
230
153
|
|
231
|
-
|
154
|
+
*Eileen M. Uchitelle*
|
232
155
|
|
233
|
-
*
|
156
|
+
* Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
|
234
157
|
|
158
|
+
Fixes #33056.
|
235
159
|
|
236
|
-
|
160
|
+
*Federico Martinez*
|
237
161
|
|
238
|
-
*
|
162
|
+
* Fix duplicated record creation when using nested attributes with `create_with`.
|
239
163
|
|
240
|
-
|
164
|
+
*Darwin Wu*
|
241
165
|
|
242
|
-
|
166
|
+
* Fix regression setting children record in parent `before_save` callback.
|
243
167
|
|
244
|
-
*
|
168
|
+
*Guo Xiang Tan*
|
245
169
|
|
246
|
-
|
170
|
+
* Prevent leaking of user's DB credentials on `rails db:create` failure.
|
247
171
|
|
248
|
-
*
|
172
|
+
*bogdanvlviv*
|
249
173
|
|
250
|
-
|
251
|
-
bind values used by the `or` instead.
|
174
|
+
* Clear mutation tracker before continuing the around callbacks.
|
252
175
|
|
253
|
-
|
254
|
-
Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql
|
255
|
-
# Currently:
|
256
|
-
# SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
|
257
|
-
# With fix:
|
258
|
-
# SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
|
259
|
-
```
|
260
|
-
|
261
|
-
*Maxime Handfield Lapointe*
|
176
|
+
*Yuya Tanaka*
|
262
177
|
|
263
|
-
*
|
264
|
-
`destroyed_by_association` will now be set to the reflection, matching the
|
265
|
-
behaviour of `has_many` associations.
|
178
|
+
* Prevent deadlocks when waiting for connection from pool.
|
266
179
|
|
267
|
-
*
|
180
|
+
*Brent Wheeldon*
|
268
181
|
|
182
|
+
* Avoid extra scoping when using `Relation#update` that was causing this method to change the current scope.
|
269
183
|
|
270
|
-
|
184
|
+
*Ryuta Kamizono*
|
271
185
|
|
272
|
-
*
|
186
|
+
* Fix numericality validator not to be affected by custom getter.
|
273
187
|
|
188
|
+
*Ryuta Kamizono*
|
274
189
|
|
275
|
-
|
190
|
+
* Fix bulk change table ignores comment option on PostgreSQL.
|
276
191
|
|
277
|
-
*
|
192
|
+
*Yoshiyuki Kinjo*
|
278
193
|
|
279
194
|
|
280
|
-
## Rails 5.1.
|
195
|
+
## Rails 5.2.1.1 (November 27, 2018) ##
|
281
196
|
|
282
197
|
* No changes.
|
283
198
|
|
284
199
|
|
285
|
-
## Rails 5.1
|
200
|
+
## Rails 5.2.1 (August 07, 2018) ##
|
286
201
|
|
287
|
-
*
|
288
|
-
`current_scope`, with the exception of `unscoped`.
|
202
|
+
* PostgreSQL: Support new relkind for partitioned tables.
|
289
203
|
|
290
|
-
Fixes #
|
204
|
+
Fixes #33008.
|
291
205
|
|
292
|
-
*
|
206
|
+
*Yannick Schutz*
|
293
207
|
|
294
|
-
*
|
295
|
-
if the child records were deleted before the parent was saved, they would
|
296
|
-
still be persisted. Now, if child records are deleted before the parent is saved
|
297
|
-
on a `has_many :through` association, the child records will not be persisted.
|
208
|
+
* Rollback parent transaction when children fails to update.
|
298
209
|
|
299
|
-
*
|
210
|
+
*Guillaume Malette*
|
300
211
|
|
212
|
+
* Fix default value for MySQL time types with specified precision.
|
301
213
|
|
302
|
-
|
214
|
+
*Nikolay Kondratyev*
|
303
215
|
|
304
|
-
*
|
305
|
-
methods stubbed, and they respect extension modules applied by a default
|
306
|
-
scope.
|
216
|
+
* Fix `touch` option to behave consistently with `Persistence#touch` method.
|
307
217
|
|
308
218
|
*Ryuta Kamizono*
|
309
219
|
|
310
|
-
*
|
311
|
-
|
312
|
-
Fixes #28589.
|
220
|
+
* Fix `save` in `after_create_commit` won't invoke extra `after_create_commit`.
|
313
221
|
|
314
|
-
|
222
|
+
Fixes #32831.
|
315
223
|
|
224
|
+
*Ryuta Kamizono*
|
316
225
|
|
317
|
-
|
226
|
+
* Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
|
318
227
|
|
319
|
-
*
|
228
|
+
*Brian Durand*
|
320
229
|
|
321
|
-
|
230
|
+
* Fix parent record should not get saved with duplicate children records.
|
322
231
|
|
323
|
-
|
232
|
+
Fixes #32940.
|
324
233
|
|
234
|
+
*Santosh Wadghule*
|
325
235
|
|
326
|
-
|
236
|
+
* Fix that association's after_touch is not called with counter cache.
|
327
237
|
|
328
|
-
|
238
|
+
Fixes #31559.
|
329
239
|
|
330
|
-
*
|
240
|
+
*Ryuta Kamizono*
|
331
241
|
|
332
|
-
*
|
333
|
-
transactional fixtures, a nested transaction will temporarily lock the
|
334
|
-
connection to the current thread, forcing others to wait.
|
242
|
+
* `becomes` should clear the mutation tracker which is created in `after_initialize`.
|
335
243
|
|
336
|
-
Fixes #
|
244
|
+
Fixes #32867.
|
337
245
|
|
338
|
-
*
|
246
|
+
*Ryuta Kamizono*
|
339
247
|
|
340
|
-
*
|
248
|
+
* Allow a belonging to parent object to be created from a new record.
|
341
249
|
|
342
|
-
|
343
|
-
load the records as needed.
|
250
|
+
*Jolyon Pawlyn*
|
344
251
|
|
345
|
-
|
252
|
+
* Fix that building record with assigning multiple has_one associations
|
253
|
+
wrongly persists through record.
|
346
254
|
|
347
|
-
|
255
|
+
Fixes #32511.
|
348
256
|
|
349
|
-
*
|
350
|
-
version-specific parts of the file.
|
257
|
+
*Sam DeCesare*
|
351
258
|
|
352
|
-
|
259
|
+
* Fix relation merging when one of the relations is going to skip the
|
260
|
+
query cache.
|
353
261
|
|
354
|
-
*
|
262
|
+
*James Williams*
|
355
263
|
|
356
|
-
* Add `:default` option to `belongs_to`.
|
357
264
|
|
358
|
-
|
359
|
-
record before validation. For example:
|
265
|
+
## Rails 5.2.0 (April 09, 2018) ##
|
360
266
|
|
361
|
-
|
362
|
-
belongs_to :account
|
363
|
-
before_validation -> { self.account ||= Current.account }
|
267
|
+
* MySQL: Support mysql2 0.5.x.
|
364
268
|
|
365
|
-
|
366
|
-
belongs_to :account, default: -> { Current.account }
|
269
|
+
*Aaron Stone*
|
367
270
|
|
368
|
-
|
271
|
+
* Apply time column precision on assignment.
|
369
272
|
|
370
|
-
|
273
|
+
PR #20317 changed the behavior of datetime columns so that when they
|
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.
|
371
276
|
|
372
|
-
|
277
|
+
Fixes #30301.
|
373
278
|
|
374
|
-
*
|
279
|
+
*Andrew White*
|
375
280
|
|
376
|
-
|
281
|
+
* Normalize time column values for SQLite database.
|
377
282
|
|
378
|
-
|
283
|
+
For legacy reasons, time columns in SQLite are stored as full datetimes
|
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.
|
379
287
|
|
380
|
-
*
|
288
|
+
*Andrew White*
|
381
289
|
|
382
|
-
|
383
|
-
path defined in `Rails.application.config.paths` however the code checked
|
384
|
-
for the presence of the `Rails` constant but not the `Rails.application`
|
385
|
-
method which caused problems when using Active Record and generators outside
|
386
|
-
of the context of a Rails application.
|
290
|
+
* Ensure that the date component is removed when quoting times.
|
387
291
|
|
388
|
-
|
292
|
+
PR #24542 altered the quoting for time columns so that the date component
|
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.
|
389
295
|
|
390
296
|
*Andrew White*
|
391
297
|
|
392
|
-
* Fix `
|
298
|
+
* Fix `dependent: :destroy` issue for has_one/belongs_to relationship where
|
299
|
+
the parent class was getting deleted when the child was not.
|
393
300
|
|
394
|
-
Fixes #
|
301
|
+
Fixes #32022.
|
395
302
|
|
396
|
-
*
|
303
|
+
*Fernando Gorodscy*
|
397
304
|
|
398
|
-
*
|
305
|
+
* Whitelist `NULLS FIRST` and `NULLS LAST` in order clauses too.
|
399
306
|
|
400
|
-
*
|
307
|
+
*Xavier Noria*
|
401
308
|
|
402
|
-
* Fix
|
309
|
+
* Fix that after commit callbacks on update does not triggered when optimistic locking is enabled.
|
403
310
|
|
404
311
|
*Ryuta Kamizono*
|
405
312
|
|
406
|
-
*
|
313
|
+
* Fix `#columns_for_distinct` of MySQL and PostgreSQL to make
|
314
|
+
`ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
|
315
|
+
even if `ORDER BY` columns include other table's primary key.
|
407
316
|
|
408
|
-
|
409
|
-
between the two columns doesn't make sense since they are different types.
|
410
|
-
The `reference_id` column is usually an integer and the `reference_type`
|
411
|
-
column a string so options like `unsigned: true` will result in an invalid
|
412
|
-
table definition.
|
317
|
+
Fixes #28364.
|
413
318
|
|
414
|
-
*
|
319
|
+
*Takumi Kagiyama*
|
415
320
|
|
416
|
-
*
|
321
|
+
* Make `reflection.klass` raise if `polymorphic?` not to be misused.
|
417
322
|
|
418
|
-
|
419
|
-
|
420
|
-
* Deprecate `supports_migrations?` on connection adapters.
|
323
|
+
Fixes #31876.
|
421
324
|
|
422
325
|
*Ryuta Kamizono*
|
423
326
|
|
424
|
-
*
|
327
|
+
* PostgreSQL: Allow pg-1.0 gem to be used with Active Record.
|
425
328
|
|
426
|
-
*
|
329
|
+
*Lars Kanis*
|
427
330
|
|
428
|
-
* Deprecate
|
331
|
+
* Deprecate `expand_hash_conditions_for_aggregates` without replacement.
|
332
|
+
Using a `Relation` for performing queries is the prefered API.
|
429
333
|
|
430
334
|
*Ryuta Kamizono*
|
431
335
|
|
432
|
-
* Fix
|
336
|
+
* Fix not expanded problem when passing an Array object as argument to the where method using `composed_of` column.
|
433
337
|
|
434
|
-
|
338
|
+
```
|
339
|
+
david_balance = customers(:david).balance
|
340
|
+
Customer.where(balance: [david_balance]).to_sql
|
435
341
|
|
436
|
-
|
342
|
+
# Before: WHERE `customers`.`balance` = NULL
|
343
|
+
# After : WHERE `customers`.`balance` = 50
|
344
|
+
```
|
437
345
|
|
438
|
-
|
346
|
+
Fixes #31723.
|
439
347
|
|
440
|
-
|
441
|
-
Internal representation of the timestamp type is UNIX time, This means
|
442
|
-
that timestamp columns are affected by time zone.
|
348
|
+
*Yutaro Kanagawa*
|
443
349
|
|
444
|
-
|
445
|
-
Query OK, 0 rows affected (0.00 sec)
|
350
|
+
* Fix `count(:all)` with eager loading and having an order other than the driving table.
|
446
351
|
|
447
|
-
|
448
|
-
Query OK, 1 row affected (0.02 sec)
|
352
|
+
Fixes #31783.
|
449
353
|
|
450
|
-
|
451
|
-
+---------------------+---------------------+
|
452
|
-
| ts | dt |
|
453
|
-
+---------------------+---------------------+
|
454
|
-
| 2016-02-07 22:11:44 | 2016-02-07 22:11:44 |
|
455
|
-
+---------------------+---------------------+
|
456
|
-
1 row in set (0.00 sec)
|
354
|
+
*Ryuta Kamizono*
|
457
355
|
|
458
|
-
|
459
|
-
Query OK, 0 rows affected (0.00 sec)
|
356
|
+
* Clear the transaction state when an Active Record object is duped.
|
460
357
|
|
461
|
-
|
462
|
-
+---------------------+---------------------+
|
463
|
-
| ts | dt |
|
464
|
-
+---------------------+---------------------+
|
465
|
-
| 2016-02-07 14:11:44 | 2016-02-07 22:11:44 |
|
466
|
-
+---------------------+---------------------+
|
467
|
-
1 row in set (0.00 sec)
|
358
|
+
Fixes #31670.
|
468
359
|
|
469
|
-
*
|
360
|
+
*Yuriy Ustushenko*
|
470
361
|
|
471
|
-
*
|
362
|
+
* Support for PostgreSQL foreign tables.
|
472
363
|
|
473
|
-
*
|
364
|
+
*fatkodima*
|
474
365
|
|
475
|
-
*
|
366
|
+
* Fix relation merger issue with `left_outer_joins`.
|
476
367
|
|
477
|
-
*
|
368
|
+
*Mehmet Emin İNAÇ*
|
478
369
|
|
479
|
-
*
|
370
|
+
* Don't allow destroyed object mutation after `save` or `save!` is called.
|
480
371
|
|
481
372
|
*Ryuta Kamizono*
|
482
373
|
|
483
|
-
*
|
374
|
+
* Take into account association conditions when deleting through records.
|
484
375
|
|
485
|
-
|
376
|
+
Fixes #18424.
|
486
377
|
|
487
|
-
*
|
488
|
-
been long unused and unsupported.
|
378
|
+
*Piotr Jakubowski*
|
489
379
|
|
490
|
-
|
491
|
-
|
492
|
-
* Make `table_name=` reset current statement cache,
|
493
|
-
so queries are not run against the previous table name.
|
380
|
+
* Fix nested `has_many :through` associations on unpersisted parent instances.
|
494
381
|
|
495
|
-
|
382
|
+
For example, if you have
|
496
383
|
|
497
|
-
|
384
|
+
class Post < ActiveRecord::Base
|
385
|
+
belongs_to :author
|
386
|
+
has_many :books, through: :author
|
387
|
+
has_many :subscriptions, through: :books
|
388
|
+
end
|
498
389
|
|
499
|
-
|
390
|
+
class Author < ActiveRecord::Base
|
391
|
+
has_one :post
|
392
|
+
has_many :books
|
393
|
+
has_many :subscriptions, through: :books
|
394
|
+
end
|
500
395
|
|
501
|
-
|
396
|
+
class Book < ActiveRecord::Base
|
397
|
+
belongs_to :author
|
398
|
+
has_many :subscriptions
|
399
|
+
end
|
502
400
|
|
503
|
-
|
401
|
+
class Subscription < ActiveRecord::Base
|
402
|
+
belongs_to :book
|
403
|
+
end
|
504
404
|
|
505
|
-
|
405
|
+
Before:
|
506
406
|
|
507
|
-
|
407
|
+
If `post` is not persisted, then `post.subscriptions` will be empty.
|
508
408
|
|
509
|
-
|
409
|
+
After:
|
510
410
|
|
511
|
-
|
411
|
+
If `post` is not persisted, then `post.subscriptions` can be set and used
|
412
|
+
just like it would if `post` were persisted.
|
512
413
|
|
513
|
-
|
414
|
+
Fixes #16313.
|
514
415
|
|
515
|
-
*
|
416
|
+
*Zoltan Kiss*
|
516
417
|
|
517
|
-
*
|
418
|
+
* Fixed inconsistency with `first(n)` when used with `limit()`.
|
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)`.
|
518
421
|
|
519
|
-
Fixes #
|
422
|
+
Fixes #23979.
|
520
423
|
|
521
|
-
*
|
424
|
+
*Brian Christian*
|
522
425
|
|
523
|
-
*
|
426
|
+
* Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
|
427
|
+
SQL queries for association counting.
|
524
428
|
|
525
|
-
|
526
|
-
MariaDB virtual columns: https://mariadb.com/kb/en/mariadb/virtual-computed-columns/
|
429
|
+
*Klas Eskilson*
|
527
430
|
|
528
|
-
|
529
|
-
Pass `stored: true` to persist the generated value (false by default).
|
431
|
+
* Fix to invoke callbacks when using `update_attribute`.
|
530
432
|
|
531
|
-
|
433
|
+
*Mike Busch*
|
532
434
|
|
533
|
-
|
534
|
-
t.string :name
|
535
|
-
t.virtual :upper_name, type: :string, as: "UPPER(name)"
|
536
|
-
t.virtual :name_length, type: :integer, as: "LENGTH(name)", stored: true
|
537
|
-
t.index :name_length # May be indexed, too!
|
538
|
-
end
|
435
|
+
* Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
|
539
436
|
|
540
437
|
*Ryuta Kamizono*
|
541
438
|
|
542
|
-
*
|
439
|
+
* Using subselect for `delete_all` with `limit` or `offset`.
|
543
440
|
|
544
441
|
*Ryuta Kamizono*
|
545
442
|
|
546
|
-
*
|
443
|
+
* Undefine attribute methods on descendants when resetting column
|
444
|
+
information.
|
547
445
|
|
548
|
-
*
|
446
|
+
*Chris Salzberg*
|
549
447
|
|
550
|
-
*
|
448
|
+
* Log database query callers.
|
551
449
|
|
552
|
-
|
450
|
+
Add `verbose_query_logs` configuration option to display the caller
|
451
|
+
of database queries in the log to facilitate N+1 query resolution
|
452
|
+
and other debugging.
|
553
453
|
|
554
|
-
|
454
|
+
Enabled in development only for new and upgraded applications. Not
|
455
|
+
recommended for use in the production environment since it relies
|
456
|
+
on Ruby's `Kernel#caller_locations` which is fairly slow.
|
555
457
|
|
556
|
-
*
|
458
|
+
*Olivier Lacan*
|
557
459
|
|
558
|
-
*
|
460
|
+
* Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
|
559
461
|
|
560
|
-
|
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
|
561
470
|
|
562
|
-
|
563
|
-
|
471
|
+
# create_table :comments do |t|
|
472
|
+
# t.belongs_to :post
|
473
|
+
# end
|
474
|
+
class Comment < ApplicationRecord
|
475
|
+
belongs_to :post, touch: true, counter_cache: true
|
476
|
+
end
|
477
|
+
```
|
564
478
|
|
565
|
-
|
479
|
+
Before:
|
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
|
566
486
|
|
567
|
-
|
487
|
+
comment = Comment.create!(post: post)
|
488
|
+
# => begin transaction
|
489
|
+
INSERT INTO "comments" ("post_id") VALUES (1)
|
568
490
|
|
569
|
-
|
491
|
+
UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
|
492
|
+
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
570
493
|
|
571
|
-
|
494
|
+
UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
|
495
|
+
"lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
|
496
|
+
rollback transaction
|
497
|
+
# => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
|
572
498
|
|
573
|
-
|
499
|
+
Comment.take.destroy!
|
500
|
+
# => begin transaction
|
501
|
+
DELETE FROM "comments" WHERE "comments"."id" = 1
|
574
502
|
|
575
|
-
|
503
|
+
UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
|
504
|
+
"lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
|
576
505
|
|
577
|
-
|
506
|
+
UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
|
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
|
+
```
|
578
511
|
|
579
|
-
|
512
|
+
After:
|
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
|
580
519
|
|
581
|
-
|
582
|
-
|
520
|
+
comment = Comment.create!(post: post)
|
521
|
+
# => begin transaction
|
522
|
+
INSERT INTO "comments" ("post_id") VALUES (1)
|
583
523
|
|
584
|
-
|
524
|
+
UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
|
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
|
585
528
|
|
586
|
-
|
529
|
+
comment.destroy!
|
530
|
+
# => begin transaction
|
531
|
+
DELETE FROM "comments" WHERE "comments"."id" = 1
|
587
532
|
|
588
|
-
|
589
|
-
|
533
|
+
UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
|
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
|
+
```
|
590
538
|
|
591
|
-
|
539
|
+
Fixes #31199.
|
592
540
|
|
593
|
-
*
|
541
|
+
*bogdanvlviv*
|
594
542
|
|
595
|
-
|
543
|
+
* Add support for PostgreSQL operator classes to `add_index`.
|
596
544
|
|
597
|
-
|
545
|
+
Example:
|
598
546
|
|
599
|
-
|
547
|
+
add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
|
600
548
|
|
601
|
-
*
|
549
|
+
*Greg Navis*
|
602
550
|
|
603
|
-
*
|
551
|
+
* Don't allow scopes to be defined which conflict with instance methods on `Relation`.
|
604
552
|
|
605
|
-
|
553
|
+
Fixes #31120.
|
606
554
|
|
607
|
-
|
608
|
-
Topic.increment_counter(:messages_count, 1, touch: true)
|
609
|
-
Topic.decrement_counter(:messages_count, 1, touch: true)
|
555
|
+
*kinnrot*
|
610
556
|
|
611
|
-
|
612
|
-
|
557
|
+
* Add new error class `QueryCanceled` which will be raised
|
558
|
+
when canceling statement due to user request.
|
613
559
|
|
614
|
-
|
615
|
-
Topic.update_counters(18, messages_count: 5, touch: %i( updated_at last_discussed_at ))
|
560
|
+
*Ryuta Kamizono*
|
616
561
|
|
617
|
-
|
562
|
+
* Add `#up_only` to database migrations for code that is only relevant when
|
563
|
+
migrating up, e.g. populating a new column.
|
618
564
|
|
619
|
-
*
|
565
|
+
*Rich Daley*
|
620
566
|
|
621
|
-
*
|
567
|
+
* Require raw SQL fragments to be explicitly marked when used in
|
568
|
+
relation query methods.
|
622
569
|
|
623
|
-
|
570
|
+
Before:
|
571
|
+
```
|
572
|
+
Article.order("LENGTH(title)")
|
573
|
+
```
|
624
574
|
|
625
|
-
|
575
|
+
After:
|
576
|
+
```
|
577
|
+
Article.order(Arel.sql("LENGTH(title)"))
|
578
|
+
```
|
626
579
|
|
627
|
-
|
580
|
+
This prevents SQL injection if applications use the [strongly
|
581
|
+
discouraged] form `Article.order(params[:my_order])`, under the
|
582
|
+
mistaken belief that only column names will be accepted.
|
628
583
|
|
629
|
-
|
584
|
+
Raw SQL strings will now cause a deprecation warning, which will
|
585
|
+
become an UnknownAttributeReference error in Rails 6.0. Applications
|
586
|
+
can opt in to the future behavior by setting `allow_unsafe_raw_sql`
|
587
|
+
to `:disabled`.
|
630
588
|
|
631
|
-
|
589
|
+
Common and judged-safe string values (such as simple column
|
590
|
+
references) are unaffected:
|
591
|
+
```
|
592
|
+
Article.order("title DESC")
|
593
|
+
```
|
632
594
|
|
633
|
-
*
|
595
|
+
*Ben Toews*
|
634
596
|
|
635
|
-
|
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.
|
636
600
|
|
637
|
-
*
|
601
|
+
*Sean Griffin*
|
638
602
|
|
639
|
-
|
603
|
+
* Add new error class `StatementTimeout` which will be raised
|
604
|
+
when statement timeout exceeded.
|
640
605
|
|
641
|
-
*
|
606
|
+
*Ryuta Kamizono*
|
642
607
|
|
643
|
-
|
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.
|
644
613
|
|
645
|
-
*
|
614
|
+
*bogdanvlviv*
|
646
615
|
|
647
|
-
|
616
|
+
* Fixed a bug where column orders for an index weren't written to
|
617
|
+
`db/schema.rb` when using the sqlite adapter.
|
648
618
|
|
649
|
-
|
619
|
+
Fixes #30902.
|
650
620
|
|
651
|
-
*
|
621
|
+
*Paul Kuruvilla*
|
652
622
|
|
653
|
-
* Remove deprecated
|
623
|
+
* Remove deprecated method `#sanitize_conditions`.
|
654
624
|
|
655
625
|
*Rafael Mendonça França*
|
656
626
|
|
657
|
-
*
|
658
|
-
order.
|
627
|
+
* Remove deprecated method `#scope_chain`.
|
659
628
|
|
660
629
|
*Rafael Mendonça França*
|
661
630
|
|
662
|
-
*
|
631
|
+
* Remove deprecated configuration `.error_on_ignored_order_or_limit`.
|
663
632
|
|
664
633
|
*Rafael Mendonça França*
|
665
634
|
|
666
|
-
*
|
635
|
+
* Remove deprecated arguments from `#verify!`.
|
667
636
|
|
668
637
|
*Rafael Mendonça França*
|
669
638
|
|
670
|
-
* Remove deprecated `
|
671
|
-
and `ActiveRecord::StatementInvalid#original_exception`.
|
639
|
+
* Remove deprecated argument `name` from `#indexes`.
|
672
640
|
|
673
641
|
*Rafael Mendonça França*
|
674
642
|
|
675
|
-
*
|
676
|
-
|
677
|
-
All the deprecations on those methods were removed.
|
643
|
+
* Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
|
678
644
|
|
679
645
|
*Rafael Mendonça França*
|
680
646
|
|
681
|
-
* Remove deprecated `
|
647
|
+
* Remove deprecated method `supports_primary_key?`.
|
682
648
|
|
683
649
|
*Rafael Mendonça França*
|
684
650
|
|
685
|
-
* Remove deprecated
|
651
|
+
* Remove deprecated method `supports_migrations?`.
|
686
652
|
|
687
653
|
*Rafael Mendonça França*
|
688
654
|
|
689
|
-
*
|
690
|
-
`config.active_record.time_zone_aware_types` is not explicitly set.
|
655
|
+
* Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
|
691
656
|
|
692
657
|
*Rafael Mendonça França*
|
693
658
|
|
694
|
-
*
|
659
|
+
* Raises when calling `lock!` in a dirty record.
|
695
660
|
|
696
661
|
*Rafael Mendonça França*
|
697
662
|
|
698
|
-
* Remove deprecated `
|
699
|
-
`activerecord.errors.messages.restrict_dependent_destroy.many` i18n scopes.
|
663
|
+
* Remove deprecated support to passing a class to `:class_name` on associations.
|
700
664
|
|
701
665
|
*Rafael Mendonça França*
|
702
666
|
|
703
|
-
*
|
704
|
-
|
705
|
-
Introduces `ActiveRecord::Tasks::DatabaseTasks.structure_(load|dump)_flags` to customize the
|
706
|
-
eventual commands run against the database, e.g. mysqldump/pg_dump.
|
667
|
+
* Remove deprecated argument `default` from `index_name_exists?`.
|
707
668
|
|
708
|
-
*
|
669
|
+
*Rafael Mendonça França*
|
709
670
|
|
710
|
-
*
|
671
|
+
* Remove deprecated support to `quoted_id` when typecasting an Active Record object.
|
711
672
|
|
712
|
-
|
673
|
+
*Rafael Mendonça França*
|
713
674
|
|
714
|
-
|
675
|
+
* Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong
|
676
|
+
ar_internal_metadata's data for a test database.
|
715
677
|
|
716
|
-
|
678
|
+
Before:
|
679
|
+
```
|
680
|
+
$ RAILS_ENV=test rails dbconsole
|
681
|
+
> SELECT * FROM ar_internal_metadata;
|
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
|
+
```
|
717
685
|
|
718
|
-
|
686
|
+
After:
|
687
|
+
```
|
688
|
+
$ RAILS_ENV=test rails dbconsole
|
689
|
+
> SELECT * FROM ar_internal_metadata;
|
690
|
+
key|value|created_at|updated_at
|
691
|
+
environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
|
692
|
+
```
|
719
693
|
|
720
|
-
|
694
|
+
Fixes #26731.
|
721
695
|
|
722
|
-
*
|
696
|
+
*bogdanvlviv*
|
723
697
|
|
724
|
-
*
|
725
|
-
column names.
|
698
|
+
* Fix longer sequence name detection for serial columns.
|
726
699
|
|
727
|
-
Fixes #
|
700
|
+
Fixes #28332.
|
728
701
|
|
729
702
|
*Ryuta Kamizono*
|
730
703
|
|
731
|
-
*
|
732
|
-
|
733
|
-
*Ryuta Kamizono*
|
704
|
+
* MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
|
734
705
|
|
735
|
-
|
736
|
-
or updated because it would violate a not null constraint.
|
706
|
+
Fixes #30894.
|
737
707
|
|
738
708
|
*Ryuta Kamizono*
|
739
709
|
|
740
|
-
*
|
741
|
-
|
742
|
-
Race conditions can occur when an ActiveRecord is destroyed
|
743
|
-
twice or destroyed and updated. The callbacks should only be
|
744
|
-
triggered once, similar to a SQL database trigger.
|
745
|
-
|
746
|
-
*Stefan Budeanu*
|
747
|
-
|
748
|
-
* Moved `DecimalWithoutScale`, `Text`, and `UnsignedInteger` from Active Model to Active Record.
|
749
|
-
|
750
|
-
*Iain Beeston*
|
751
|
-
|
752
|
-
* Fix `write_attribute` method to check whether an attribute is aliased or not, and
|
753
|
-
use the aliased attribute name if needed.
|
754
|
-
|
755
|
-
*Prathamesh Sonpatki*
|
756
|
-
|
757
|
-
* Fix `read_attribute` method to check whether an attribute is aliased or not, and
|
758
|
-
use the aliased attribute name if needed.
|
759
|
-
|
760
|
-
Fixes #26417.
|
761
|
-
|
762
|
-
*Prathamesh Sonpatki*
|
763
|
-
|
764
|
-
* PostgreSQL & MySQL: Use big integer as primary key type for new tables.
|
765
|
-
|
766
|
-
*Jon McCartie*, *Pavel Pravosud*
|
767
|
-
|
768
|
-
* Change the type argument of `ActiveRecord::Base#attribute` to be optional.
|
769
|
-
The default is now `ActiveRecord::Type::Value.new`, which provides no type
|
770
|
-
casting behavior.
|
771
|
-
|
772
|
-
*Sean Griffin*
|
773
|
-
|
774
|
-
* Don't treat unsigned integers with zerofill as signed.
|
710
|
+
* Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
|
775
711
|
|
776
|
-
Fixes #
|
712
|
+
Fixes #30886.
|
777
713
|
|
778
714
|
*Ryuta Kamizono*
|
779
715
|
|
780
|
-
*
|
781
|
-
|
782
|
-
*Sergey Alekseev*
|
783
|
-
|
784
|
-
* Raise `ActiveRecord::RecordNotFound` from collection `*_ids` setters
|
785
|
-
for unknown IDs with a better error message.
|
716
|
+
* PostgreSQL `tsrange` now preserves subsecond precision.
|
786
717
|
|
787
|
-
|
788
|
-
|
789
|
-
|
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:
|
790
723
|
|
791
|
-
|
792
|
-
|
793
|
-
* For PostgreSQL >= 9.4 use `pgcrypto`'s `gen_random_uuid()` instead of
|
794
|
-
`uuid-ossp`'s UUID generation function.
|
795
|
-
|
796
|
-
*Yuji Yaginuma*, *Yaw Boakye*
|
724
|
+
Before:
|
797
725
|
|
798
|
-
|
799
|
-
|
800
|
-
association.
|
726
|
+
connection.type_cast(tsrange.serialize(range_value))
|
727
|
+
# => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
|
801
728
|
|
802
|
-
|
803
|
-
in #20888. Unfortunately the suggested alternative of
|
804
|
-
`article.reload.category` does not expose the same behavior.
|
729
|
+
Now:
|
805
730
|
|
806
|
-
|
807
|
-
|
808
|
-
passing true to the association reader used to have.
|
731
|
+
connection.type_cast(tsrange.serialize(range_value))
|
732
|
+
# => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
|
809
733
|
|
810
|
-
*
|
734
|
+
*Thomas Cannon*
|
811
735
|
|
812
|
-
*
|
813
|
-
|
736
|
+
* Passing a `Set` to `Relation#where` now behaves the same as passing an
|
737
|
+
array.
|
814
738
|
|
815
|
-
*
|
739
|
+
*Sean Griffin*
|
816
740
|
|
817
|
-
*
|
818
|
-
values for Postgres HStore columns.
|
741
|
+
* Use given algorithm while removing index from database.
|
819
742
|
|
820
|
-
Fixes #
|
743
|
+
Fixes #24190.
|
821
744
|
|
822
|
-
*
|
745
|
+
*Mehmet Emin İNAÇ*
|
823
746
|
|
824
|
-
*
|
747
|
+
* Update payload names for `sql.active_record` instrumentation to be
|
748
|
+
more descriptive.
|
825
749
|
|
826
|
-
|
750
|
+
Fixes #30586.
|
827
751
|
|
828
|
-
|
829
|
-
{ size: 15, connections: 1, busy: 1, dead: 0, idle: 0, waiting: 0, checkout_timeout: 5 }
|
752
|
+
*Jeremy Green*
|
830
753
|
|
831
|
-
|
754
|
+
* Add new error class `LockWaitTimeout` which will be raised
|
755
|
+
when lock wait timeout exceeded.
|
832
756
|
|
833
|
-
*
|
834
|
-
and `exists?`.
|
757
|
+
*Gabriel Courtemanche*
|
835
758
|
|
836
|
-
|
837
|
-
for performance. We should not unscope the order in the case.
|
759
|
+
* Remove deprecated `#migration_keys`.
|
838
760
|
|
839
761
|
*Ryuta Kamizono*
|
840
762
|
|
841
|
-
*
|
842
|
-
datetime.
|
843
|
-
|
844
|
-
Fixes #24195.
|
845
|
-
|
846
|
-
*Sen Zhang*
|
847
|
-
|
848
|
-
* Allow `slice` to take an array of methods(without the need for splatting).
|
849
|
-
|
850
|
-
*Cohen Carlisle*
|
851
|
-
|
852
|
-
* Improved partial writes with HABTM and has many through associations
|
853
|
-
to fire database query only if relation has been changed.
|
854
|
-
|
855
|
-
Fixes #19663.
|
856
|
-
|
857
|
-
*Mehmet Emin İNAÇ*
|
858
|
-
|
859
|
-
* Deprecate passing arguments and block at the same time to
|
860
|
-
`ActiveRecord::QueryMethods#select`.
|
861
|
-
|
862
|
-
*Prathamesh Sonpatki*
|
763
|
+
* Automatically guess the inverse associations for STI.
|
863
764
|
|
864
|
-
*
|
765
|
+
*Yuichiro Kaneko*
|
865
766
|
|
866
|
-
|
767
|
+
* Ensure `sum` honors `distinct` on `has_many :through` associations.
|
867
768
|
|
868
|
-
|
769
|
+
Fixes #16791.
|
869
770
|
|
870
|
-
*
|
871
|
-
PostgreSQL.
|
771
|
+
*Aaron Wortham*
|
872
772
|
|
873
|
-
|
773
|
+
* Add `binary` fixture helper method.
|
874
774
|
|
875
|
-
*
|
775
|
+
*Atsushi Yoshida*
|
876
776
|
|
877
|
-
|
777
|
+
* When using `Relation#or`, extract the common conditions and put them before the OR condition.
|
878
778
|
|
879
|
-
*
|
880
|
-
to be updated is unchanged.
|
779
|
+
*Maxime Handfield Lapointe*
|
881
780
|
|
882
|
-
|
781
|
+
* `Relation#or` now accepts two relations who have different values for
|
782
|
+
`references` only, as `references` can be implicitly called by `where`.
|
883
783
|
|
884
|
-
|
784
|
+
Fixes #29411.
|
885
785
|
|
886
|
-
*
|
786
|
+
*Sean Griffin*
|
887
787
|
|
888
|
-
|
889
|
-
|
890
|
-
added using the `Errors#add` method. It was also inconsistent with the
|
891
|
-
`Errors#messages` storage.
|
788
|
+
* `ApplicationRecord` is no longer generated when generating models. If you
|
789
|
+
need to generate it, it can be created with `rails g application_record`.
|
892
790
|
|
893
|
-
|
894
|
-
cause a small breaking change because in those cases the details could
|
895
|
-
be accessed as strings keys but now it can not.
|
791
|
+
*Lisa Ugray*
|
896
792
|
|
897
|
-
|
793
|
+
* Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
|
898
794
|
|
899
|
-
*
|
795
|
+
*Ryuta Kamizono*
|
900
796
|
|
901
|
-
*
|
902
|
-
|
797
|
+
* When a `has_one` association is destroyed by `dependent: destroy`,
|
798
|
+
`destroyed_by_association` will now be set to the reflection, matching the
|
799
|
+
behaviour of `has_many` associations.
|
903
800
|
|
904
|
-
|
801
|
+
*Lisa Ugray*
|
905
802
|
|
906
|
-
|
803
|
+
* Fix `unscoped(where: [columns])` removing the wrong bind values.
|
907
804
|
|
908
|
-
|
909
|
-
|
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)
|
910
807
|
|
911
|
-
|
808
|
+
```
|
809
|
+
Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql
|
810
|
+
# Currently:
|
811
|
+
# SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
|
812
|
+
# With fix:
|
813
|
+
# SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
|
814
|
+
```
|
912
815
|
|
913
|
-
*
|
914
|
-
in the array.
|
816
|
+
*Maxime Handfield Lapointe*
|
915
817
|
|
916
|
-
|
818
|
+
* Values constructed using multi-parameter assignment will now use the
|
819
|
+
post-type-cast value for rendering in single-field form inputs.
|
917
820
|
|
918
821
|
*Sean Griffin*
|
919
822
|
|
920
|
-
*
|
921
|
-
`
|
823
|
+
* `Relation#joins` is no longer affected by the target model's
|
824
|
+
`current_scope`, with the exception of `unscoped`.
|
922
825
|
|
923
|
-
Fixes #
|
826
|
+
Fixes #29338.
|
924
827
|
|
925
828
|
*Sean Griffin*
|
926
829
|
|
927
|
-
*
|
928
|
-
loaded then the foreign key is changed directly and the record saved.
|
830
|
+
* Change sqlite3 boolean serialization to use 1 and 0.
|
929
831
|
|
930
|
-
|
832
|
+
SQLite natively recognizes 1 and 0 as true and false, but does not natively
|
833
|
+
recognize 't' and 'f' as was previously serialized.
|
931
834
|
|
932
|
-
|
835
|
+
This change in serialization requires a migration of stored boolean data
|
836
|
+
for SQLite databases, so it's implemented behind a configuration flag
|
837
|
+
whose default false value is deprecated.
|
933
838
|
|
934
|
-
*
|
935
|
-
|
936
|
-
* Avoid loading records from database when they are already loaded using
|
937
|
-
the `pluck` method on a collection.
|
938
|
-
|
939
|
-
Fixes #25921.
|
940
|
-
|
941
|
-
*Ryuta Kamizono*
|
839
|
+
*Lisa Ugray*
|
942
840
|
|
943
|
-
*
|
944
|
-
|
945
|
-
|
946
|
-
Strict mode controls how MySQL handles invalid or missing values in
|
947
|
-
data-change statements such as INSERT or UPDATE. If strict mode is not
|
948
|
-
in effect, MySQL inserts adjusted values for invalid or missing values
|
949
|
-
and produces warnings.
|
950
|
-
|
951
|
-
def test_mysql_not_null_defaults_non_strict
|
952
|
-
using_strict(false) do
|
953
|
-
with_mysql_not_null_table do |klass|
|
954
|
-
record = klass.new
|
955
|
-
assert_nil record.non_null_integer
|
956
|
-
assert_nil record.non_null_string
|
957
|
-
assert_nil record.non_null_text
|
958
|
-
assert_nil record.non_null_blob
|
959
|
-
|
960
|
-
record.save!
|
961
|
-
record.reload
|
962
|
-
|
963
|
-
assert_equal 0, record.non_null_integer
|
964
|
-
assert_equal "", record.non_null_string
|
965
|
-
assert_equal "", record.non_null_text
|
966
|
-
assert_equal "", record.non_null_blob
|
967
|
-
end
|
968
|
-
end
|
969
|
-
end
|
841
|
+
* Skip query caching when working with batches of records (`find_each`, `find_in_batches`,
|
842
|
+
`in_batches`).
|
970
843
|
|
971
|
-
|
844
|
+
Previously, records would be fetched in batches, but all records would be retained in memory
|
845
|
+
until the end of the request or job.
|
972
846
|
|
973
|
-
*
|
847
|
+
*Eugene Kenny*
|
974
848
|
|
975
|
-
*
|
976
|
-
|
977
|
-
type.
|
849
|
+
* Prevent errors raised by `sql.active_record` notification subscribers from being converted into
|
850
|
+
`ActiveRecord::StatementInvalid` exceptions.
|
978
851
|
|
979
|
-
|
852
|
+
*Dennis Taylor*
|
980
853
|
|
981
|
-
|
854
|
+
* Fix eager loading/preloading association with scope including joins.
|
982
855
|
|
983
|
-
|
856
|
+
Fixes #28324.
|
984
857
|
|
985
858
|
*Ryuta Kamizono*
|
986
859
|
|
987
|
-
*
|
988
|
-
force a DISTINCT. This solves issues when using count after a left_joins.
|
860
|
+
* Fix transactions to apply state to child transactions.
|
989
861
|
|
990
|
-
|
991
|
-
|
992
|
-
* RecordNotFound raised by association.find exposes `id`, `primary_key` and
|
993
|
-
`model` methods to be consistent with RecordNotFound raised by Record.find.
|
862
|
+
Previously, if you had a nested transaction and the outer transaction was rolledback, the record from the
|
863
|
+
inner transaction would still be marked as persisted.
|
994
864
|
|
995
|
-
|
865
|
+
This change fixes that by applying the state of the parent transaction to the child transaction when the
|
866
|
+
parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
|
996
867
|
|
997
|
-
*
|
998
|
-
mapping methods are methods implemented on `Hash`.
|
868
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
999
869
|
|
1000
|
-
|
870
|
+
* Deprecate `set_state` method in `TransactionState`.
|
1001
871
|
|
1002
|
-
|
872
|
+
Deprecated the `set_state` method in favor of setting the state via specific methods. If you need to mark the
|
873
|
+
state of the transaction you can now use `rollback!`, `commit!` or `nullify!` instead of
|
874
|
+
`set_state(:rolledback)`, `set_state(:committed)`, or `set_state(nil)`.
|
1003
875
|
|
1004
|
-
*
|
876
|
+
*Eileen M. Uchitelle*, *Aaron Patterson*
|
1005
877
|
|
1006
|
-
|
878
|
+
* Deprecate delegating to `arel` in `Relation`.
|
1007
879
|
|
1008
|
-
*
|
1009
|
-
database.
|
880
|
+
*Ryuta Kamizono*
|
1010
881
|
|
1011
|
-
|
882
|
+
* Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
|
883
|
+
without being connected.
|
1012
884
|
|
1013
|
-
*
|
885
|
+
*Tsukasa Oishi*
|
1014
886
|
|
1015
|
-
|
887
|
+
* Previously, when building records using a `has_many :through` association,
|
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.
|
1016
891
|
|
1017
|
-
*
|
892
|
+
*Tobias Kraze*
|
1018
893
|
|
1019
|
-
|
894
|
+
* Merging two relations representing nested joins no longer transforms the joins of
|
895
|
+
the merged relation into LEFT OUTER JOIN.
|
1020
896
|
|
1021
|
-
|
897
|
+
Example:
|
1022
898
|
|
1023
|
-
|
1024
|
-
|
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...
|
1025
903
|
|
1026
|
-
|
904
|
+
# After the change:
|
905
|
+
#=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
|
906
|
+
```
|
1027
907
|
|
1028
|
-
*
|
908
|
+
*Maxime Handfield Lapointe*
|
1029
909
|
|
1030
|
-
*
|
1031
|
-
the
|
910
|
+
* `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
|
911
|
+
`locking_column`, without default value, is null in the database.
|
1032
912
|
|
1033
|
-
*
|
913
|
+
*bogdanvlviv*
|
1034
914
|
|
1035
|
-
*
|
915
|
+
* Fix destroying existing object does not work well when optimistic locking enabled and
|
916
|
+
`locking_column` is null in the database.
|
1036
917
|
|
1037
|
-
|
1038
|
-
# ...
|
1039
|
-
end
|
918
|
+
*bogdanvlviv*
|
1040
919
|
|
1041
|
-
|
920
|
+
* Use bulk INSERT to insert fixtures for better performance.
|
1042
921
|
|
1043
|
-
*
|
922
|
+
*Kir Shatrov*
|
1044
923
|
|
1045
|
-
*
|
1046
|
-
the hash keys after calling a calculation method like `count`.
|
924
|
+
* Prevent creation of bind param if casted value is nil.
|
1047
925
|
|
1048
|
-
|
926
|
+
*Ryuta Kamizono*
|
1049
927
|
|
1050
|
-
|
928
|
+
* Deprecate passing arguments and block at the same time to `count` and `sum` in `ActiveRecord::Calculations`.
|
1051
929
|
|
1052
|
-
*
|
1053
|
-
the resulting output is actually up to 20 characters, not
|
1054
|
-
effectively 17 to leave room for the default "...".
|
1055
|
-
Also call `#parameterize` before `#truncate` and make the
|
1056
|
-
`separator: /-/` to maximize the information included in the
|
1057
|
-
output.
|
930
|
+
*Ryuta Kamizono*
|
1058
931
|
|
1059
|
-
|
932
|
+
* Loading model schema from database is now thread-safe.
|
1060
933
|
|
1061
|
-
|
934
|
+
Fixes #28589.
|
1062
935
|
|
1063
|
-
*
|
1064
|
-
same connection to two threads.
|
936
|
+
*Vikrant Chaudhary*, *David Abdemoulaie*
|
1065
937
|
|
1066
|
-
|
938
|
+
* Add `ActiveRecord::Base#cache_version` to support recyclable cache keys via the new versioned entries
|
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.
|
1067
941
|
|
1068
|
-
|
942
|
+
NOTE: This feature is turned off by default, and `#cache_key` will still return cache keys with timestamps
|
943
|
+
until you set `ActiveRecord::Base.cache_versioning = true`. That's the setting for all new apps on Rails 5.2+
|
1069
944
|
|
1070
|
-
*
|
1071
|
-
truncates the array, preventing `inspect` from looping infinitely in some
|
1072
|
-
cases.
|
945
|
+
*DHH*
|
1073
946
|
|
1074
|
-
|
947
|
+
* Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
|
1075
948
|
|
1076
|
-
*
|
1077
|
-
`ActiveRecord::Base.connection_id=`.
|
949
|
+
*Rusty Geldmacher*, *Guillermo Iguaran*
|
1078
950
|
|
1079
|
-
|
951
|
+
* Add type caster to `RuntimeReflection#alias_name`.
|
1080
952
|
|
1081
|
-
|
953
|
+
Fixes #28959.
|
1082
954
|
|
1083
|
-
|
955
|
+
*Jon Moss*
|
1084
956
|
|
1085
|
-
|
957
|
+
* Deprecate `supports_statement_cache?`.
|
1086
958
|
|
1087
|
-
*
|
1088
|
-
was provided as a Hash.
|
959
|
+
*Ryuta Kamizono*
|
1089
960
|
|
1090
|
-
|
961
|
+
* Raise error `UnknownMigrationVersionError` on the movement of migrations
|
962
|
+
when the current migration does not exist.
|
1091
963
|
|
1092
|
-
*
|
1093
|
-
adapter returns `''` instead of `nil`.
|
964
|
+
*bogdanvlviv*
|
1094
965
|
|
1095
|
-
|
966
|
+
* Fix `bin/rails db:forward` first migration.
|
1096
967
|
|
1097
|
-
*
|
1098
|
-
transaction serialization failures or deadlocks.
|
968
|
+
*bogdanvlviv*
|
1099
969
|
|
1100
|
-
|
970
|
+
* Support Descending Indexes for MySQL.
|
1101
971
|
|
1102
|
-
|
972
|
+
MySQL 8.0.1 and higher supports descending indexes: `DESC` in an index definition is no longer ignored.
|
973
|
+
See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
|
1103
974
|
|
1104
|
-
|
1105
|
-
when invoking `psql` to make sure errors are not suppressed.
|
975
|
+
*Ryuta Kamizono*
|
1106
976
|
|
1107
|
-
|
977
|
+
* Fix inconsistency with changed attributes when overriding Active Record attribute reader.
|
1108
978
|
|
1109
|
-
|
979
|
+
*bogdanvlviv*
|
1110
980
|
|
1111
|
-
|
981
|
+
* When calling the dynamic fixture accessor method with no arguments, it now returns all fixtures of this type.
|
982
|
+
Previously this method always returned an empty array.
|
1112
983
|
|
1113
|
-
*
|
984
|
+
*Kevin McPhillips*
|
1114
985
|
|
1115
986
|
|
1116
|
-
Please check [5-
|
987
|
+
Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activerecord/CHANGELOG.md) for previous changes.
|