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