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.

Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +655 -608
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -5
  5. data/examples/performance.rb +2 -0
  6. data/examples/simple.rb +2 -0
  7. data/lib/active_record/aggregations.rb +6 -5
  8. data/lib/active_record/association_relation.rb +7 -5
  9. data/lib/active_record/associations/alias_tracker.rb +19 -27
  10. data/lib/active_record/associations/association.rb +41 -37
  11. data/lib/active_record/associations/association_scope.rb +38 -50
  12. data/lib/active_record/associations/belongs_to_association.rb +28 -9
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -8
  14. data/lib/active_record/associations/builder/association.rb +4 -7
  15. data/lib/active_record/associations/builder/belongs_to.rb +14 -5
  16. data/lib/active_record/associations/builder/collection_association.rb +3 -3
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +3 -1
  18. data/lib/active_record/associations/builder/has_many.rb +2 -0
  19. data/lib/active_record/associations/builder/has_one.rb +2 -0
  20. data/lib/active_record/associations/builder/singular_association.rb +2 -0
  21. data/lib/active_record/associations/collection_association.rb +59 -47
  22. data/lib/active_record/associations/collection_proxy.rb +20 -49
  23. data/lib/active_record/associations/foreign_association.rb +2 -0
  24. data/lib/active_record/associations/has_many_association.rb +12 -1
  25. data/lib/active_record/associations/has_many_through_association.rb +36 -30
  26. data/lib/active_record/associations/has_one_association.rb +12 -1
  27. data/lib/active_record/associations/has_one_through_association.rb +13 -8
  28. data/lib/active_record/associations/join_dependency/join_association.rb +39 -63
  29. data/lib/active_record/associations/join_dependency/join_base.rb +9 -8
  30. data/lib/active_record/associations/join_dependency/join_part.rb +9 -9
  31. data/lib/active_record/associations/join_dependency.rb +48 -93
  32. data/lib/active_record/associations/preloader/association.rb +45 -61
  33. data/lib/active_record/associations/preloader/through_association.rb +71 -79
  34. data/lib/active_record/associations/preloader.rb +18 -38
  35. data/lib/active_record/associations/singular_association.rb +14 -16
  36. data/lib/active_record/associations/through_association.rb +26 -11
  37. data/lib/active_record/associations.rb +40 -63
  38. data/lib/active_record/attribute_assignment.rb +2 -5
  39. data/lib/active_record/attribute_decorators.rb +3 -2
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +2 -0
  41. data/lib/active_record/attribute_methods/dirty.rb +32 -216
  42. data/lib/active_record/attribute_methods/primary_key.rb +7 -6
  43. data/lib/active_record/attribute_methods/query.rb +2 -0
  44. data/lib/active_record/attribute_methods/read.rb +9 -3
  45. data/lib/active_record/attribute_methods/serialization.rb +23 -0
  46. data/lib/active_record/attribute_methods/time_zone_conversion.rb +6 -8
  47. data/lib/active_record/attribute_methods/write.rb +21 -9
  48. data/lib/active_record/attribute_methods.rb +65 -24
  49. data/lib/active_record/attributes.rb +7 -6
  50. data/lib/active_record/autosave_association.rb +35 -19
  51. data/lib/active_record/base.rb +2 -0
  52. data/lib/active_record/callbacks.rb +12 -6
  53. data/lib/active_record/coders/json.rb +2 -0
  54. data/lib/active_record/coders/yaml_column.rb +15 -1
  55. data/lib/active_record/collection_cache_key.rb +12 -8
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +142 -42
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +7 -0
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +174 -33
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +15 -5
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -32
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +14 -5
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +64 -6
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +31 -53
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +152 -81
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +66 -21
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +84 -97
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +110 -173
  69. data/lib/active_record/connection_adapters/column.rb +3 -1
  70. data/lib/active_record/connection_adapters/connection_specification.rb +17 -3
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +13 -2
  72. data/lib/active_record/connection_adapters/mysql/column.rb +2 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +47 -2
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +2 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +9 -10
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -3
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +7 -10
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +30 -30
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +106 -1
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +2 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -2
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +2 -0
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -0
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +2 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +13 -1
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +2 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +2 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +2 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -1
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +2 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +5 -3
  99. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +2 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +2 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +8 -2
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +4 -2
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +3 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +18 -0
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +19 -25
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +50 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +24 -11
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +20 -13
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +234 -112
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +3 -1
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +66 -74
  117. data/lib/active_record/connection_adapters/schema_cache.rb +4 -2
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +2 -0
  119. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +2 -0
  120. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +24 -1
  121. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +2 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +6 -15
  123. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +3 -2
  124. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +75 -1
  125. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +82 -95
  126. data/lib/active_record/connection_adapters/statement_pool.rb +2 -0
  127. data/lib/active_record/connection_handling.rb +4 -2
  128. data/lib/active_record/core.rb +51 -61
  129. data/lib/active_record/counter_cache.rb +20 -15
  130. data/lib/active_record/define_callbacks.rb +5 -3
  131. data/lib/active_record/dynamic_matchers.rb +9 -9
  132. data/lib/active_record/enum.rb +18 -13
  133. data/lib/active_record/errors.rb +60 -15
  134. data/lib/active_record/explain.rb +3 -1
  135. data/lib/active_record/explain_registry.rb +2 -0
  136. data/lib/active_record/explain_subscriber.rb +2 -0
  137. data/lib/active_record/fixture_set/file.rb +2 -0
  138. data/lib/active_record/fixtures.rb +67 -60
  139. data/lib/active_record/gem_version.rb +5 -3
  140. data/lib/active_record/inheritance.rb +49 -19
  141. data/lib/active_record/integration.rb +58 -19
  142. data/lib/active_record/internal_metadata.rb +2 -0
  143. data/lib/active_record/legacy_yaml_adapter.rb +3 -1
  144. data/lib/active_record/locking/optimistic.rb +30 -42
  145. data/lib/active_record/locking/pessimistic.rb +9 -6
  146. data/lib/active_record/log_subscriber.rb +43 -0
  147. data/lib/active_record/migration/command_recorder.rb +11 -9
  148. data/lib/active_record/migration/compatibility.rb +47 -9
  149. data/lib/active_record/migration/join_table.rb +2 -0
  150. data/lib/active_record/migration.rb +189 -139
  151. data/lib/active_record/model_schema.rb +19 -24
  152. data/lib/active_record/nested_attributes.rb +18 -6
  153. data/lib/active_record/no_touching.rb +3 -1
  154. data/lib/active_record/null_relation.rb +2 -0
  155. data/lib/active_record/persistence.rb +198 -49
  156. data/lib/active_record/query_cache.rb +12 -14
  157. data/lib/active_record/querying.rb +4 -2
  158. data/lib/active_record/railtie.rb +80 -6
  159. data/lib/active_record/railties/console_sandbox.rb +2 -0
  160. data/lib/active_record/railties/controller_runtime.rb +2 -0
  161. data/lib/active_record/railties/databases.rake +46 -36
  162. data/lib/active_record/readonly_attributes.rb +3 -2
  163. data/lib/active_record/reflection.rb +108 -194
  164. data/lib/active_record/relation/batches/batch_enumerator.rb +2 -0
  165. data/lib/active_record/relation/batches.rb +20 -5
  166. data/lib/active_record/relation/calculations.rb +46 -20
  167. data/lib/active_record/relation/delegation.rb +45 -27
  168. data/lib/active_record/relation/finder_methods.rb +77 -78
  169. data/lib/active_record/relation/from_clause.rb +2 -8
  170. data/lib/active_record/relation/merger.rb +53 -23
  171. data/lib/active_record/relation/predicate_builder/array_handler.rb +10 -7
  172. data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
  173. data/lib/active_record/relation/predicate_builder/base_handler.rb +2 -2
  174. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +12 -1
  175. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +56 -0
  176. data/lib/active_record/relation/predicate_builder/range_handler.rb +26 -9
  177. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  178. data/lib/active_record/relation/predicate_builder.rb +60 -79
  179. data/lib/active_record/relation/query_attribute.rb +28 -2
  180. data/lib/active_record/relation/query_methods.rb +129 -100
  181. data/lib/active_record/relation/record_fetch_warning.rb +2 -0
  182. data/lib/active_record/relation/spawn_methods.rb +4 -2
  183. data/lib/active_record/relation/where_clause.rb +65 -68
  184. data/lib/active_record/relation/where_clause_factory.rb +5 -48
  185. data/lib/active_record/relation.rb +120 -214
  186. data/lib/active_record/result.rb +2 -0
  187. data/lib/active_record/runtime_registry.rb +2 -0
  188. data/lib/active_record/sanitization.rb +129 -121
  189. data/lib/active_record/schema.rb +4 -2
  190. data/lib/active_record/schema_dumper.rb +36 -26
  191. data/lib/active_record/schema_migration.rb +2 -0
  192. data/lib/active_record/scoping/default.rb +8 -9
  193. data/lib/active_record/scoping/named.rb +23 -7
  194. data/lib/active_record/scoping.rb +9 -8
  195. data/lib/active_record/secure_token.rb +2 -0
  196. data/lib/active_record/serialization.rb +2 -0
  197. data/lib/active_record/statement_cache.rb +23 -13
  198. data/lib/active_record/store.rb +3 -1
  199. data/lib/active_record/suppressor.rb +2 -0
  200. data/lib/active_record/table_metadata.rb +12 -3
  201. data/lib/active_record/tasks/database_tasks.rb +26 -15
  202. data/lib/active_record/tasks/mysql_database_tasks.rb +9 -48
  203. data/lib/active_record/tasks/postgresql_database_tasks.rb +10 -2
  204. data/lib/active_record/tasks/sqlite_database_tasks.rb +25 -3
  205. data/lib/active_record/timestamp.rb +13 -6
  206. data/lib/active_record/touch_later.rb +2 -0
  207. data/lib/active_record/transactions.rb +33 -28
  208. data/lib/active_record/translation.rb +2 -0
  209. data/lib/active_record/type/adapter_specific_registry.rb +2 -0
  210. data/lib/active_record/type/date.rb +2 -0
  211. data/lib/active_record/type/date_time.rb +2 -0
  212. data/lib/active_record/type/decimal_without_scale.rb +2 -0
  213. data/lib/active_record/type/hash_lookup_type_map.rb +2 -0
  214. data/lib/active_record/type/internal/timezone.rb +2 -0
  215. data/lib/active_record/type/json.rb +30 -0
  216. data/lib/active_record/type/serialized.rb +6 -0
  217. data/lib/active_record/type/text.rb +2 -0
  218. data/lib/active_record/type/time.rb +2 -0
  219. data/lib/active_record/type/type_map.rb +2 -0
  220. data/lib/active_record/type/unsigned_integer.rb +2 -0
  221. data/lib/active_record/type.rb +4 -1
  222. data/lib/active_record/type_caster/connection.rb +2 -0
  223. data/lib/active_record/type_caster/map.rb +3 -1
  224. data/lib/active_record/type_caster.rb +2 -0
  225. data/lib/active_record/validations/absence.rb +2 -0
  226. data/lib/active_record/validations/associated.rb +2 -0
  227. data/lib/active_record/validations/length.rb +2 -0
  228. data/lib/active_record/validations/presence.rb +2 -0
  229. data/lib/active_record/validations/uniqueness.rb +36 -6
  230. data/lib/active_record/validations.rb +2 -0
  231. data/lib/active_record/version.rb +2 -0
  232. data/lib/active_record.rb +11 -4
  233. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  234. data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  235. data/lib/rails/generators/active_record/migration/migration_generator.rb +3 -1
  236. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +0 -0
  237. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +0 -0
  238. data/lib/rails/generators/active_record/migration.rb +2 -0
  239. data/lib/rails/generators/active_record/model/model_generator.rb +2 -23
  240. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +0 -0
  241. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  242. data/lib/rails/generators/active_record.rb +3 -1
  243. metadata +26 -40
  244. data/lib/active_record/associations/preloader/belongs_to.rb +0 -15
  245. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  246. data/lib/active_record/associations/preloader/has_many.rb +0 -15
  247. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  248. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  249. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  250. data/lib/active_record/associations/preloader/singular_association.rb +0 -18
  251. data/lib/active_record/attribute/user_provided_default.rb +0 -30
  252. data/lib/active_record/attribute.rb +0 -240
  253. data/lib/active_record/attribute_mutation_tracker.rb +0 -114
  254. data/lib/active_record/attribute_set/builder.rb +0 -124
  255. data/lib/active_record/attribute_set/yaml_encoder.rb +0 -41
  256. data/lib/active_record/attribute_set.rb +0 -113
  257. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -10
  258. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  259. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  260. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -59
  261. data/lib/active_record/type/internal/abstract_json.rb +0 -37
data/CHANGELOG.md CHANGED
@@ -1,1037 +1,1084 @@
1
- ## Rails 5.1.5 (February 14, 2018) ##
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
- * Fix `count(:all)` with eager loading and having an order other than the driving table.
26
+ [CVE-2022-32224]
4
27
 
5
- Fixes #31783.
6
28
 
7
- *Ryuta Kamizono*
29
+ ## Rails 5.2.8 (May 09, 2022) ##
8
30
 
9
- * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
10
- SQL queries for association counting.
31
+ * No changes.
11
32
 
12
- *Klas Eskilson*
13
33
 
14
- * Fix to invoke callbacks when using `update_attribute`.
34
+ ## Rails 5.2.7.1 (April 26, 2022) ##
15
35
 
16
- *Mike Busch*
36
+ * No changes.
17
37
 
18
- * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
19
38
 
20
- *Ryuta Kamizono*
39
+ ## Rails 5.2.7 (March 10, 2022) ##
21
40
 
22
- * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
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
- # create_table :comments do |t|
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
- Before:
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
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
54
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
49
+ ## Rails 5.2.6.2 (February 11, 2022) ##
55
50
 
56
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
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
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
66
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
54
+ ## Rails 5.2.6.1 (February 11, 2022) ##
67
55
 
68
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
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
- comment = Comment.create!(post: post)
83
- # => begin transaction
84
- INSERT INTO "comments" ("post_id") VALUES (1)
59
+ ## Rails 5.2.6 (May 05, 2021) ##
85
60
 
86
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
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
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
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
- Fixes #31199.
66
+ * No changes.
102
67
 
103
- *bogdanvlviv*
104
68
 
105
- * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
106
- without being connected.
69
+ ## Rails 5.2.4.6 (May 05, 2021) ##
107
70
 
108
- *Tsukasa Oishi*
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
- Before:
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
- After:
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
- Fixes #26731.
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
- *bogdanvlviv*
82
+ Thanks to @dee-see from Hackerone for this patch!
132
83
 
133
- * Fix longer sequence name detection for serial columns.
84
+ [CVE-2021-22880]
134
85
 
135
- Fixes #28332.
86
+ *Aaron Patterson*
136
87
 
137
- *Ryuta Kamizono*
138
88
 
139
- * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
89
+ ## Rails 5.2.4.4 (September 09, 2020) ##
140
90
 
141
- Fixes #30894.
91
+ * No changes.
142
92
 
143
- *Ryuta Kamizono*
144
93
 
145
- * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
94
+ ## Rails 5.2.4.3 (May 18, 2020) ##
146
95
 
147
- Fixes #30886.
96
+ * No changes.
148
97
 
149
- *Ryuta Kamizono*
98
+ ## Rails 5.2.4.2 (March 19, 2020) ##
99
+
100
+ * No changes.
150
101
 
151
102
 
152
- ## Rails 5.1.4 (September 07, 2017) ##
103
+ ## Rails 5.2.4.1 (December 18, 2019) ##
153
104
 
154
105
  * No changes.
155
106
 
156
107
 
157
- ## Rails 5.1.4.rc1 (August 24, 2017) ##
108
+ ## Rails 5.2.4 (November 27, 2019) ##
158
109
 
159
- * Ensure `sum` honors `distinct` on `has_many :through` associations
110
+ * Fix circular `autosave: true` causes invalid records to be saved.
160
111
 
161
- Fixes #16791
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
- *Aaron Wortham
120
+ Fixes #28080.
164
121
 
165
- * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
122
+ *Larry Reid*
166
123
 
167
- *Ryuta Kamizono*
124
+ * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
168
125
 
169
- * Fix `unscoped(where: [columns])` removing the wrong bind values
126
+ Fixes #36022.
170
127
 
171
- When the `where` is called on a relation after a `or`, unscoping the column of that later `where`, it removed
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
- *Maxime Handfield Lapointe*
132
+ *Martin R. Schuster*
183
133
 
184
- * When a `has_one` association is destroyed by `dependent: destroy`,
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
- *Lisa Ugray*
136
+ Fixes #36465.
189
137
 
138
+ *Jeff Doering*
190
139
 
191
- ## Rails 5.1.3 (August 03, 2017) ##
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
- * No changes.
143
+ Fixes #33249.
194
144
 
145
+ *Ryan H. Kerr*
195
146
 
196
- ## Rails 5.1.3.rc3 (July 31, 2017) ##
197
147
 
198
- * No changes.
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
- ## Rails 5.1.3.rc2 (July 25, 2017) ##
152
+ Fixes #35214.
202
153
 
203
- * No changes.
154
+ *Juani Villarejo*
204
155
 
156
+ * Fix prepared statements caching to be enabled even when query caching is enabled.
205
157
 
206
- ## Rails 5.1.3.rc1 (July 19, 2017) ##
158
+ *Ryuta Kamizono*
207
159
 
208
- * `Relation#joins` is no longer affected by the target model's
209
- `current_scope`, with the exception of `unscoped`.
160
+ * Don't allow `where` with invalid value matches to nil values.
210
161
 
211
- Fixes #29338.
162
+ Fixes #33624.
212
163
 
213
- *Sean Griffin*
164
+ *Ryuta Kamizono*
214
165
 
215
- * Previously, when building records using a `has_many :through` association,
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
- *Tobias Kraze*
168
+ Fixes #34743.
221
169
 
170
+ *Ryuta Kamizono*
171
+
172
+ * Fix join table column quoting with SQLite.
222
173
 
223
- ## Rails 5.1.2 (June 26, 2017) ##
174
+ *Gannon McGibbon*
224
175
 
225
- * Restore previous behavior of collection proxies: their values can have
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
- * Loading model schema from database is now thread-safe.
180
+ * Reset scope after delete on collection association to clear stale offsets of removed records.
232
181
 
233
- Fixes #28589.
182
+ *Gannon McGibbon*
234
183
 
235
- *Vikrant Chaudhary*, *David Abdemoulaie*
236
184
 
185
+ ## Rails 5.2.2.1 (March 11, 2019) ##
237
186
 
238
- ## Rails 5.1.1 (May 12, 2017) ##
187
+ * No changes.
239
188
 
240
- * Add type caster to `RuntimeReflection#alias_name`
241
189
 
242
- Fixes #28959.
190
+ ## Rails 5.2.2 (December 04, 2018) ##
243
191
 
244
- *Jon Moss*
192
+ * Do not ignore the scoping with query methods in the scope block.
245
193
 
194
+ *Ryuta Kamizono*
246
195
 
247
- ## Rails 5.1.0 (April 27, 2017) ##
196
+ * Allow aliased attributes to be used in `#update_columns` and `#update`.
248
197
 
249
- * Quote database name in db:create grant statement (when database_user does not have access to create the database).
198
+ *Gannon McGibbon*
250
199
 
251
- *Rune Philosof*
200
+ * Allow spaces in postgres table names.
252
201
 
253
- * When multiple threads are sharing a database connection inside a test using
254
- transactional fixtures, a nested transaction will temporarily lock the
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
- Fixes #28197.
205
+ *Gannon McGibbon*
258
206
 
259
- *Matthew Draper*
207
+ * Cached columns_hash fields should be excluded from ResultSet#column_types
260
208
 
261
- * Load only needed records on `ActiveRecord::Relation#inspect`.
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
- Instead of loading all records and returning only a subset of those, just
264
- load the records as needed.
212
+ ```ruby
213
+ class DeveloperName < ActiveRecord::Type::String
214
+ def deserialize(value)
215
+ "Developer: #{value}"
216
+ end
217
+ end
265
218
 
266
- Fixes #25537.
219
+ class AttributedDeveloper < ActiveRecord::Base
220
+ self.table_name = "developers"
267
221
 
268
- *Hendy Tanata*
222
+ attribute :name, DeveloperName.new
269
223
 
270
- * Remove comments from structure.sql when using postgresql adapter to avoid
271
- version-specific parts of the file.
224
+ self.ignored_columns += ["name"]
225
+ end
272
226
 
273
- Fixes #28153.
227
+ developer = AttributedDeveloper.create
228
+ developer.update_column :name, "name"
274
229
 
275
- *Ari Pollak*
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
- * Add `:default` option to `belongs_to`.
234
+ *Dmitry Tsepelev*
278
235
 
279
- Use it to specify that an association should be initialized with a particular
280
- record before validation. For example:
236
+ * Values of enum are frozen, raising an error when attempting to modify them.
281
237
 
282
- # Before
283
- belongs_to :account
284
- before_validation -> { self.account ||= Current.account }
238
+ *Emmanuel Byrd*
285
239
 
286
- # After
287
- belongs_to :account, default: -> { Current.account }
240
+ * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
241
+ if the attribute does not exist.
288
242
 
289
- *George Claghorn*
243
+ *Sean Griffin*
290
244
 
291
- * Deprecate `Migrator.schema_migrations_table_name`.
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 select with block doesn't return newly built records in has_many association.
249
+ * Fix query cache to load before first request.
296
250
 
297
- Fixes #28348.
251
+ *Eileen M. Uchitelle*
298
252
 
299
- *Ryuta Kamizono*
253
+ * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
300
254
 
301
- * Check whether `Rails.application` defined before calling it
255
+ Fixes #33056.
302
256
 
303
- In #27674 we changed the migration generator to generate migrations at the
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
- Fixes #28325.
259
+ * Fix duplicated record creation when using nested attributes with `create_with`.
310
260
 
311
- *Andrew White*
261
+ *Darwin Wu*
312
262
 
313
- * Fix `deserialize` with JSON array.
263
+ * Fix regression setting children record in parent `before_save` callback.
314
264
 
315
- Fixes #28285.
265
+ *Guo Xiang Tan*
316
266
 
317
- *Ryuta Kamizono*
267
+ * Prevent leaking of user's DB credentials on `rails db:create` failure.
318
268
 
319
- * Fix `rake db:schema:load` with subdirectories.
269
+ *bogdanvlviv*
320
270
 
321
- *Ryuta Kamizono*
271
+ * Clear mutation tracker before continuing the around callbacks.
322
272
 
323
- * Fix `rake db:migrate:status` with subdirectories.
273
+ *Yuya Tanaka*
324
274
 
325
- *Ryuta Kamizono*
275
+ * Prevent deadlocks when waiting for connection from pool.
326
276
 
327
- * Don't share options between reference id and type columns
277
+ *Brent Wheeldon*
328
278
 
329
- When using a polymorphic reference column in a migration, sharing options
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
- * Use `max_identifier_length` for `index_name_length` in PostgreSQL adapter.
283
+ * Fix numericality validator not to be affected by custom getter.
338
284
 
339
285
  *Ryuta Kamizono*
340
286
 
341
- * Deprecate `supports_migrations?` on connection adapters.
287
+ * Fix bulk change table ignores comment option on PostgreSQL.
342
288
 
343
- *Ryuta Kamizono*
289
+ *Yoshiyuki Kinjo*
344
290
 
345
- * Fix regression of #1969 with SELECT aliases in HAVING clause.
346
291
 
347
- *Eugene Kenny*
292
+ ## Rails 5.2.1.1 (November 27, 2018) ##
348
293
 
349
- * Deprecate using `#quoted_id` in quoting.
294
+ * No changes.
350
295
 
351
- *Ryuta Kamizono*
352
296
 
353
- * Fix `wait_timeout` to configurable for mysql2 adapter.
297
+ ## Rails 5.2.1 (August 07, 2018) ##
354
298
 
355
- Fixes #26556.
299
+ * PostgreSQL: Support new relkind for partitioned tables.
356
300
 
357
- *Ryuta Kamizono*
301
+ Fixes #33008.
358
302
 
359
- * Correctly dump native timestamp types for MySQL.
303
+ *Yannick Schutz*
360
304
 
361
- The native timestamp type in MySQL is different from datetime type.
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
- > SET time_zone = '+00:00';
366
- Query OK, 0 rows affected (0.00 sec)
307
+ *Guillaume Malette*
367
308
 
368
- > INSERT INTO time_with_zone(ts,dt) VALUES (NOW(),NOW());
369
- Query OK, 1 row affected (0.02 sec)
309
+ * Fix default value for MySQL time types with specified precision.
370
310
 
371
- > SELECT * FROM time_with_zone;
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
- > SET time_zone = '-08:00';
380
- Query OK, 0 rows affected (0.00 sec)
313
+ * Fix `touch` option to behave consistently with `Persistence#touch` method.
381
314
 
382
- > SELECT * FROM time_with_zone;
383
- +---------------------+---------------------+
384
- | ts | dt |
385
- +---------------------+---------------------+
386
- | 2016-02-07 14:11:44 | 2016-02-07 22:11:44 |
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
- * All integer-like PKs are autoincrement unless they have an explicit default.
323
+ * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
393
324
 
394
- *Matthew Draper*
325
+ *Brian Durand*
395
326
 
396
- * Omit redundant `using: :btree` for schema dumping.
327
+ * Fix parent record should not get saved with duplicate children records.
397
328
 
398
- *Ryuta Kamizono*
329
+ Fixes #32940.
399
330
 
400
- * Deprecate passing `default` to `index_name_exists?`.
331
+ *Santosh Wadghule*
401
332
 
402
- *Ryuta Kamizono*
333
+ * Fix that association's after_touch is not called with counter cache.
403
334
 
404
- * PostgreSQL: schema dumping support for interval and OID columns.
335
+ Fixes #31559.
405
336
 
406
337
  *Ryuta Kamizono*
407
338
 
408
- * Deprecate `supports_primary_key?` on connection adapters since it's
409
- been long unused and unsupported.
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
- * Make `table_name=` reset current statement cache,
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
- *namusyaka*
347
+ *Jolyon Pawlyn*
417
348
 
418
- * Allow `ActiveRecord::Base#as_json` to be passed a frozen Hash.
349
+ * Fix that building record with assigning multiple has_one associations
350
+ wrongly persists through record.
419
351
 
420
- *Isaac Betesh*
352
+ Fixes #32511.
421
353
 
422
- * Fix inspection behavior when the :id column is not primary key.
354
+ *Sam DeCesare*
423
355
 
424
- *namusyaka*
356
+ * Fix relation merging when one of the relations is going to skip the
357
+ query cache.
425
358
 
426
- * Deprecate locking records with unpersisted changes.
359
+ *James Williams*
427
360
 
428
- *Marc Schütz*
429
361
 
430
- * Remove deprecated behavior that halts callbacks when the return is false.
362
+ ## Rails 5.2.0 (April 09, 2018) ##
431
363
 
432
- *Rafael Mendonça França*
364
+ * MySQL: Support mysql2 0.5.x.
433
365
 
434
- * Deprecate `ColumnDumper#migration_keys`.
366
+ *Aaron Stone*
435
367
 
436
- *Ryuta Kamizono*
368
+ * Apply time column precision on assignment.
437
369
 
438
- * Fix `association_primary_key_type` for reflections with symbol primary key.
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 #27864.
374
+ Fixes #30301.
441
375
 
442
- *Daniel Colson*
376
+ *Andrew White*
443
377
 
444
- * Virtual/generated column support for MySQL 5.7.5+ and MariaDB 5.2.0+.
378
+ * Normalize time column values for SQLite database.
445
379
 
446
- MySQL generated columns: https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
447
- MariaDB virtual columns: https://mariadb.com/kb/en/mariadb/virtual-computed-columns/
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
- Declare virtual columns with `t.virtual name, type: …, as: "expression"`.
450
- Pass `stored: true` to persist the generated value (false by default).
385
+ *Andrew White*
451
386
 
452
- Example:
387
+ * Ensure that the date component is removed when quoting times.
453
388
 
454
- create_table :generated_columns do |t|
455
- t.string :name
456
- t.virtual :upper_name, type: :string, as: "UPPER(name)"
457
- t.virtual :name_length, type: :integer, as: "LENGTH(name)", stored: true
458
- t.index :name_length # May be indexed, too!
459
- end
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
- * Deprecate `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
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
- * Support foreign key creation for SQLite3.
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
- * Place generated migrations into the path set by `config.paths["db/migrate"]`.
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
- *Kevin Glowacz*
445
+ *Yutaro Kanagawa*
474
446
 
475
- * Raise `ActiveRecord::InvalidForeignKey` when a foreign key constraint fails on SQLite3.
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
- * Add the touch option to `#increment!` and `#decrement!`.
453
+ * Clear the transaction state when an Active Record object is duped.
480
454
 
481
- *Hiroaki Izu*
455
+ Fixes #31670.
482
456
 
483
- * Deprecate passing a class to the `class_name` because it eagerloads more classes than
484
- necessary and potentially creates circular dependencies.
457
+ *Yuriy Ustushenko*
485
458
 
486
- *Kir Shatrov*
459
+ * Support for PostgreSQL foreign tables.
487
460
 
488
- * Raise error when has_many through is defined before through association.
461
+ *fatkodima*
489
462
 
490
- Fixes #26834.
463
+ * Fix relation merger issue with `left_outer_joins`.
491
464
 
492
- *Chris Holmes*
465
+ *Mehmet Emin İNAÇ*
493
466
 
494
- * Deprecate passing `name` to `indexes`.
467
+ * Don't allow destroyed object mutation after `save` or `save!` is called.
495
468
 
496
469
  *Ryuta Kamizono*
497
470
 
498
- * Remove deprecated tasks: `db:test:clone`, `db:test:clone_schema`, `db:test:clone_structure`.
471
+ * Take into account association conditions when deleting through records.
499
472
 
500
- *Rafel Mendonça França*
473
+ Fixes #18424.
501
474
 
502
- * Compare deserialized values for `PostgreSQL::OID::Hstore` types when
503
- calling `ActiveRecord::Dirty#changed_in_place?`.
475
+ *Piotr Jakubowski*
504
476
 
505
- Fixes #27502.
477
+ * Fix nested `has_many :through` associations on unpersisted parent instances.
506
478
 
507
- *Jon Moss*
479
+ For example, if you have
508
480
 
509
- * Raise `ArgumentError` when passing an `ActiveRecord::Base` instance to `.find`,
510
- `.exists?` and `.update`.
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
- *Rafael Mendonça França*
487
+ class Author < ActiveRecord::Base
488
+ has_one :post
489
+ has_many :books
490
+ has_many :subscriptions, through: :books
491
+ end
513
492
 
514
- * Respect precision option for arrays of timestamps.
493
+ class Book < ActiveRecord::Base
494
+ belongs_to :author
495
+ has_many :subscriptions
496
+ end
515
497
 
516
- Fixes #27514.
498
+ class Subscription < ActiveRecord::Base
499
+ belongs_to :book
500
+ end
517
501
 
518
- *Sean Griffin*
502
+ Before:
519
503
 
520
- * Optimize slow model instantiation when using STI and `store_full_sti_class = false` option.
504
+ If `post` is not persisted, then `post.subscriptions` will be empty.
521
505
 
522
- *Konstantin Lazarev*
506
+ After:
523
507
 
524
- * Add `touch` option to counter cache modifying methods.
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
- Works when updating, resetting, incrementing and decrementing counters:
511
+ Fixes #16313.
527
512
 
528
- # Touches `updated_at`/`updated_on`.
529
- Topic.increment_counter(:messages_count, 1, touch: true)
530
- Topic.decrement_counter(:messages_count, 1, touch: true)
513
+ *Zoltan Kiss*
531
514
 
532
- # Touches `last_discussed_at`.
533
- Topic.reset_counters(18, :messages, touch: :last_discussed_at)
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
- # Touches `updated_at` and `last_discussed_at`.
536
- Topic.update_counters(18, messages_count: 5, touch: %i( updated_at last_discussed_at ))
519
+ Fixes #23979.
537
520
 
538
- Fixes #26724.
521
+ *Brian Christian*
539
522
 
540
- *Jarred Trost*
523
+ * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
524
+ SQL queries for association counting.
541
525
 
542
- * Remove deprecated `#uniq`, `#uniq!`, and `#uniq_value`.
526
+ *Klas Eskilson*
543
527
 
544
- *Ryuta Kamizono*
528
+ * Fix to invoke callbacks when using `update_attribute`.
545
529
 
546
- * Remove deprecated `#insert_sql`, `#update_sql`, and `#delete_sql`.
530
+ *Mike Busch*
547
531
 
548
- *Ryuta Kamizono*
532
+ * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
549
533
 
550
- * Remove deprecated `#use_transactional_fixtures` configuration.
534
+ *Ryuta Kamizono*
551
535
 
552
- *Rafael Mendonça França*
536
+ * Using subselect for `delete_all` with `limit` or `offset`.
553
537
 
554
- * Remove deprecated `#raise_in_transactional_callbacks` configuration.
538
+ *Ryuta Kamizono*
555
539
 
556
- *Rafael Mendonça França*
540
+ * Undefine attribute methods on descendants when resetting column
541
+ information.
557
542
 
558
- * Remove deprecated `#load_schema_for`.
543
+ *Chris Salzberg*
559
544
 
560
- *Rafael Mendonça França*
545
+ * Log database query callers.
561
546
 
562
- * Remove deprecated conditions parameter from `#destroy_all` and `#delete_all`.
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
- *Rafael Mendonça França*
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
- * Remove deprecated support to passing arguments to `#select` when a block is provided.
555
+ *Olivier Lacan*
567
556
 
568
- *Rafael Mendonça França*
557
+ * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
569
558
 
570
- * Remove deprecated support to query using commas on LIMIT.
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
- *Rafael Mendonça França*
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
- * Remove deprecated support to passing a class as a value in a query.
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
- *Rafael Mendonça França*
584
+ comment = Comment.create!(post: post)
585
+ # => begin transaction
586
+ INSERT INTO "comments" ("post_id") VALUES (1)
577
587
 
578
- * Raise `ActiveRecord::IrreversibleOrderError` when using `last` with an irreversible
579
- order.
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
- *Rafael Mendonça França*
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
- * Raise when a `has_many :through` association has an ambiguous reflection name.
596
+ Comment.take.destroy!
597
+ # => begin transaction
598
+ DELETE FROM "comments" WHERE "comments"."id" = 1
584
599
 
585
- *Rafael Mendonça França*
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
- * Raise when `ActiveRecord::Migration` is inherited from directly.
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
- *Rafael Mendonça França*
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
- * Remove deprecated `original_exception` argument in `ActiveRecord::StatementInvalid#initialize`
592
- and `ActiveRecord::StatementInvalid#original_exception`.
617
+ comment = Comment.create!(post: post)
618
+ # => begin transaction
619
+ INSERT INTO "comments" ("post_id") VALUES (1)
593
620
 
594
- *Rafael Mendonça França*
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
- * `#tables` and `#table_exists?` return only tables and not views.
626
+ comment.destroy!
627
+ # => begin transaction
628
+ DELETE FROM "comments" WHERE "comments"."id" = 1
597
629
 
598
- All the deprecations on those methods were removed.
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
- *Rafael Mendonça França*
636
+ Fixes #31199.
601
637
 
602
- * Remove deprecated `name` argument from `#tables`.
638
+ *bogdanvlviv*
603
639
 
604
- *Rafael Mendonça França*
640
+ * Add support for PostgreSQL operator classes to `add_index`.
605
641
 
606
- * Remove deprecated support to passing a column to `#quote`.
642
+ Example:
607
643
 
608
- *Rafael Mendonça França*
644
+ add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
609
645
 
610
- * Set `:time` as a timezone aware type and remove deprecation when
611
- `config.active_record.time_zone_aware_types` is not explicitly set.
646
+ *Greg Navis*
612
647
 
613
- *Rafael Mendonça França*
648
+ * Don't allow scopes to be defined which conflict with instance methods on `Relation`.
614
649
 
615
- * Remove deprecated force reload argument in singular and collection association readers.
650
+ Fixes #31120.
616
651
 
617
- *Rafael Mendonça França*
652
+ *kinnrot*
618
653
 
619
- * Remove deprecated `activerecord.errors.messages.restrict_dependent_destroy.one` and
620
- `activerecord.errors.messages.restrict_dependent_destroy.many` i18n scopes.
654
+ * Add new error class `QueryCanceled` which will be raised
655
+ when canceling statement due to user request.
621
656
 
622
- *Rafael Mendonça França*
657
+ *Ryuta Kamizono*
623
658
 
624
- * Allow passing extra flags to `db:structure:load` and `db:structure:dump`
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
- Introduces `ActiveRecord::Tasks::DatabaseTasks.structure_(load|dump)_flags` to customize the
627
- eventual commands run against the database, e.g. mysqldump/pg_dump.
662
+ *Rich Daley*
628
663
 
629
- *Kir Shatrov*
664
+ * Require raw SQL fragments to be explicitly marked when used in
665
+ relation query methods.
630
666
 
631
- * Notifications see frozen SQL string.
667
+ Before:
668
+ ```
669
+ Article.order("LENGTH(title)")
670
+ ```
632
671
 
633
- Fixes #23774.
672
+ After:
673
+ ```
674
+ Article.order(Arel.sql("LENGTH(title)"))
675
+ ```
634
676
 
635
- *Richard Monette*
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
- * RuntimeErrors are no longer translated to `ActiveRecord::StatementInvalid`.
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
- *Richard Monette*
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
- * Change the schema cache format to use YAML instead of Marshal.
692
+ *Ben Toews*
642
693
 
643
- *Kir Shatrov*
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
- * Support index length and order options using both string and symbol
646
- column names.
698
+ *Sean Griffin*
647
699
 
648
- Fixes #27243.
700
+ * Add new error class `StatementTimeout` which will be raised
701
+ when statement timeout exceeded.
649
702
 
650
703
  *Ryuta Kamizono*
651
704
 
652
- * Raise `ActiveRecord::RangeError` when values that executed are out of range.
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
- *Ryuta Kamizono*
711
+ *bogdanvlviv*
655
712
 
656
- * Raise `ActiveRecord::NotNullViolation` when a record cannot be inserted
657
- or updated because it would violate a not null constraint.
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
- *Ryuta Kamizono*
716
+ Fixes #30902.
660
717
 
661
- * Emulate db trigger behaviour for after_commit :destroy, :update.
718
+ *Paul Kuruvilla*
662
719
 
663
- Race conditions can occur when an ActiveRecord is destroyed
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
- *Stefan Budeanu*
722
+ *Rafael Mendonça França*
668
723
 
669
- * Moved `DecimalWithoutScale`, `Text`, and `UnsignedInteger` from Active Model to Active Record.
724
+ * Remove deprecated method `#scope_chain`.
670
725
 
671
- *Iain Beeston*
726
+ *Rafael Mendonça França*
672
727
 
673
- * Fix `write_attribute` method to check whether an attribute is aliased or not, and
674
- use the aliased attribute name if needed.
728
+ * Remove deprecated configuration `.error_on_ignored_order_or_limit`.
675
729
 
676
- *Prathamesh Sonpatki*
730
+ *Rafael Mendonça França*
677
731
 
678
- * Fix `read_attribute` method to check whether an attribute is aliased or not, and
679
- use the aliased attribute name if needed.
732
+ * Remove deprecated arguments from `#verify!`.
680
733
 
681
- Fixes #26417.
734
+ *Rafael Mendonça França*
682
735
 
683
- *Prathamesh Sonpatki*
736
+ * Remove deprecated argument `name` from `#indexes`.
684
737
 
685
- * PostgreSQL & MySQL: Use big integer as primary key type for new tables.
738
+ *Rafael Mendonça França*
686
739
 
687
- *Jon McCartie*, *Pavel Pravosud*
740
+ * Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
688
741
 
689
- * Change the type argument of `ActiveRecord::Base#attribute` to be optional.
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
- *Sean Griffin*
744
+ * Remove deprecated method `supports_primary_key?`.
694
745
 
695
- * Don't treat unsigned integers with zerofill as signed.
746
+ *Rafael Mendonça França*
696
747
 
697
- Fixes #27125.
748
+ * Remove deprecated method `supports_migrations?`.
698
749
 
699
- *Ryuta Kamizono*
750
+ *Rafael Mendonça França*
700
751
 
701
- * Fix the uniqueness validation scope with a polymorphic association.
752
+ * Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
702
753
 
703
- *Sergey Alekseev*
754
+ *Rafael Mendonça França*
704
755
 
705
- * Raise `ActiveRecord::RecordNotFound` from collection `*_ids` setters
706
- for unknown IDs with a better error message.
756
+ * Raises when calling `lock!` in a dirty record.
707
757
 
708
- Changes the collection `*_ids` setters to cast provided IDs the data
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
- *Dominic Cleal*
760
+ * Remove deprecated support to passing a class to `:class_name` on associations.
713
761
 
714
- * For PostgreSQL >= 9.4 use `pgcrypto`'s `gen_random_uuid()` instead of
715
- `uuid-ossp`'s UUID generation function.
762
+ *Rafael Mendonça França*
716
763
 
717
- *Yuji Yaginuma*, *Yaw Boakye*
764
+ * Remove deprecated argument `default` from `index_name_exists?`.
718
765
 
719
- * Introduce `Model#reload_<association>` to bring back the behavior
720
- of `Article.category(true)` where `category` is a singular
721
- association.
766
+ *Rafael Mendonça França*
722
767
 
723
- The force reloading of the association reader was deprecated
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
- This patch adds a reader method with the prefix `reload_` for
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
- *Yves Senn*
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
- * Make sure eager loading `ActiveRecord::Associations` also loads
734
- constants defined in `ActiveRecord::Associations::Preloader`.
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
- *Yves Senn*
791
+ Fixes #26731.
737
792
 
738
- * Allow `ActionController::Parameters`-like objects to be passed as
739
- values for Postgres HStore columns.
793
+ *bogdanvlviv*
740
794
 
741
- Fixes #26904.
795
+ * Fix longer sequence name detection for serial columns.
742
796
 
743
- *Jon Moss*
797
+ Fixes #28332.
744
798
 
745
- * Added `stat` method to `ActiveRecord::ConnectionAdapters::ConnectionPool`.
799
+ *Ryuta Kamizono*
746
800
 
747
- Example:
801
+ * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
748
802
 
749
- ActiveRecord::Base.connection_pool.stat # =>
750
- { size: 15, connections: 1, busy: 1, dead: 0, idle: 0, waiting: 0, checkout_timeout: 5 }
803
+ Fixes #30894.
751
804
 
752
- *Pavel Evstigneev*
805
+ *Ryuta Kamizono*
753
806
 
754
- * Avoid `unscope(:order)` when `limit_value` is presented for `count`
755
- and `exists?`.
807
+ * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
756
808
 
757
- If `limit_value` is presented, records fetching order is very important
758
- for performance. We should not unscope the order in the case.
809
+ Fixes #30886.
759
810
 
760
811
  *Ryuta Kamizono*
761
812
 
762
- * Fix an Active Record `DateTime` field `NoMethodError` caused by incomplete
763
- datetime.
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
- Fixes #24195.
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
- *Sen Zhang*
831
+ *Thomas Cannon*
768
832
 
769
- * Allow `slice` to take an array of methods(without the need for splatting).
833
+ * Passing a `Set` to `Relation#where` now behaves the same as passing an
834
+ array.
770
835
 
771
- *Cohen Carlisle*
836
+ *Sean Griffin*
772
837
 
773
- * Improved partial writes with HABTM and has many through associations
774
- to fire database query only if relation has been changed.
838
+ * Use given algorithm while removing index from database.
775
839
 
776
- Fixes #19663.
840
+ Fixes #24190.
777
841
 
778
842
  *Mehmet Emin İNAÇ*
779
843
 
780
- * Deprecate passing arguments and block at the same time to
781
- `ActiveRecord::QueryMethods#select`.
844
+ * Update payload names for `sql.active_record` instrumentation to be
845
+ more descriptive.
782
846
 
783
- *Prathamesh Sonpatki*
847
+ Fixes #30586.
784
848
 
785
- * Fixed: Optimistic locking does not work well with `null` in the database.
849
+ *Jeremy Green*
786
850
 
787
- Fixes #26024.
851
+ * Add new error class `LockWaitTimeout` which will be raised
852
+ when lock wait timeout exceeded.
788
853
 
789
- *bogdanvlviv*
854
+ *Gabriel Courtemanche*
855
+
856
+ * Remove deprecated `#migration_keys`.
857
+
858
+ *Ryuta Kamizono*
790
859
 
791
- * Fixed support for case insensitive comparisons of `text` columns in
792
- PostgreSQL.
860
+ * Automatically guess the inverse associations for STI.
793
861
 
794
- *Edho Arief*
862
+ *Yuichiro Kaneko*
795
863
 
796
- * Serialize JSON attribute value `nil` as SQL `NULL`, not JSON `null`.
864
+ * Ensure `sum` honors `distinct` on `has_many :through` associations.
797
865
 
798
- *Trung Duc Tran*
866
+ Fixes #16791.
799
867
 
800
- * Return `true` from `update_attribute` when the value of the attribute
801
- to be updated is unchanged.
868
+ *Aaron Wortham*
802
869
 
803
- Fixes #26593.
870
+ * Add `binary` fixture helper method.
804
871
 
805
- *Prathamesh Sonpatki*
872
+ *Atsushi Yoshida*
806
873
 
807
- * Always store errors details information with symbols.
874
+ * When using `Relation#or`, extract the common conditions and put them before the OR condition.
808
875
 
809
- When the association is autosaved we were storing the details with
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
- To fix this inconsistency we are always storing with symbols. This will
815
- cause a small breaking change because in those cases the details could
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
- Fix #26499.
881
+ Fixes #29411.
819
882
 
820
- *Rafael Mendonça França*, *Marcus Vieira*
883
+ *Sean Griffin*
821
884
 
822
- * Calling `touch` on a model using optimistic locking will now leave the model
823
- in a non-dirty state with no attribute changes.
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
- Fixes #26496.
888
+ *Lisa Ugray*
826
889
 
827
- *Jakob Skjerning*
890
+ * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
828
891
 
829
- * Using a mysql2 connection after it fails to reconnect will now have an error message
830
- saying the connection is closed rather than an undefined method error message.
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
- *Dylan Thacker-Smith*
898
+ *Lisa Ugray*
833
899
 
834
- * PostgreSQL array columns will now respect the encoding of strings contained
835
- in the array.
900
+ * Fix `unscoped(where: [columns])` removing the wrong bind values.
836
901
 
837
- Fixes #26326.
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
- *Sean Griffin*
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
- * Inverse association instances will now be set before `after_find` or
842
- `after_initialize` callbacks are run.
913
+ *Maxime Handfield Lapointe*
843
914
 
844
- Fixes #26320.
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
- * Remove unnecessarily association load when a `belongs_to` association has already been
849
- loaded then the foreign key is changed directly and the record saved.
920
+ * `Relation#joins` is no longer affected by the target model's
921
+ `current_scope`, with the exception of `unscoped`.
850
922
 
851
- *James Coleman*
923
+ Fixes #29338.
852
924
 
853
- * Remove standardized column types/arguments spaces in schema dump.
925
+ *Sean Griffin*
854
926
 
855
- *Tim Petricola*
927
+ * Change sqlite3 boolean serialization to use 1 and 0.
856
928
 
857
- * Avoid loading records from database when they are already loaded using
858
- the `pluck` method on a collection.
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
- Fixes #25921.
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
- *Ryuta Kamizono*
936
+ *Lisa Ugray*
863
937
 
864
- * Remove text default treated as an empty string in non-strict mode for
865
- consistency with other types.
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
- https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict
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
- *Ryuta Kamizono*
944
+ *Eugene Kenny*
895
945
 
896
- * SQLite3 migrations to add a column to an existing table can now be
897
- successfully rolled back when the column was given and invalid column
898
- type.
946
+ * Prevent errors raised by `sql.active_record` notification subscribers from being converted into
947
+ `ActiveRecord::StatementInvalid` exceptions.
899
948
 
900
- Fixes #26087.
949
+ *Dennis Taylor*
901
950
 
902
- *Travis O'Neill*
951
+ * Fix eager loading/preloading association with scope including joins.
903
952
 
904
- * Deprecate `sanitize_conditions`. Use `sanitize_sql` instead.
953
+ Fixes #28324.
905
954
 
906
955
  *Ryuta Kamizono*
907
956
 
908
- * Doing count on relations that contain LEFT OUTER JOIN Arel node no longer
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
- *Maxime Handfield Lapointe*
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
- *Michel Pigassou*
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
- * Hashes can once again be passed to setters of `composed_of`, if all of the
919
- mapping methods are methods implemented on `Hash`.
965
+ *Eileen M. Uchitelle*, *Aaron Patterson*
920
966
 
921
- Fixes #25978.
967
+ * Deprecate `set_state` method in `TransactionState`.
922
968
 
923
- *Sean Griffin*
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
- * Fix the SELECT statement in `#table_comment` for MySQL.
973
+ *Eileen M. Uchitelle*, *Aaron Patterson*
926
974
 
927
- *Takeshi Akima*
975
+ * Deprecate delegating to `arel` in `Relation`.
928
976
 
929
- * Virtual attributes will no longer raise when read on models loaded from the
930
- database.
977
+ *Ryuta Kamizono*
931
978
 
932
- *Sean Griffin*
979
+ * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
980
+ without being connected.
933
981
 
934
- * Support calling the method `merge` in `scope`'s lambda.
982
+ *Tsukasa Oishi*
935
983
 
936
- *Yasuhiro Sugino*
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
- * Fixes multi-parameter attributes conversion with invalid params.
989
+ *Tobias Kraze*
939
990
 
940
- *Hiroyuki Ishii*
991
+ * Merging two relations representing nested joins no longer transforms the joins of
992
+ the merged relation into LEFT OUTER JOIN.
941
993
 
942
- * Add newline between each migration in `structure.sql`.
994
+ Example:
943
995
 
944
- Keeps schema migration inserts as a single commit, but allows for easier
945
- git diffing.
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
- Fixes #25504.
1001
+ # After the change:
1002
+ #=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
1003
+ ```
948
1004
 
949
- *Grey Baker*, *Norberto Lopes*
1005
+ *Maxime Handfield Lapointe*
950
1006
 
951
- * The flag `error_on_ignored_order_or_limit` has been deprecated in favor of
952
- the current `error_on_ignored_order`.
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
- *Xavier Noria*
1010
+ *bogdanvlviv*
955
1011
 
956
- * Batch processing methods support `limit`:
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
- Post.limit(10_000).find_each do |post|
959
- # ...
960
- end
1015
+ *bogdanvlviv*
961
1016
 
962
- It also works in `find_in_batches` and `in_batches`.
1017
+ * Use bulk INSERT to insert fixtures for better performance.
963
1018
 
964
- *Xavier Noria*
1019
+ *Kir Shatrov*
965
1020
 
966
- * Using `group` with an attribute that has a custom type will properly cast
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
- Fixes #25595.
1023
+ *Ryuta Kamizono*
970
1024
 
971
- *Sean Griffin*
1025
+ * Deprecate passing arguments and block at the same time to `count` and `sum` in `ActiveRecord::Calculations`.
972
1026
 
973
- * Fix the generated `#to_param` method to use `omission: ''` so that
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
- Fixes #23635.
1029
+ * Loading model schema from database is now thread-safe.
981
1030
 
982
- *Rob Biedenharn*
1031
+ Fixes #28589.
983
1032
 
984
- * Ensure concurrent invocations of the connection reaper cannot allocate the
985
- same connection to two threads.
1033
+ *Vikrant Chaudhary*, *David Abdemoulaie*
986
1034
 
987
- Fixes #25585.
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
- *Matthew Draper*
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
- * Inspecting an object with an associated array of over 10 elements no longer
992
- truncates the array, preventing `inspect` from looping infinitely in some
993
- cases.
1042
+ *DHH*
994
1043
 
995
- *Kevin McPhillips*
1044
+ * Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
996
1045
 
997
- * Removed the unused methods `ActiveRecord::Base.connection_id` and
998
- `ActiveRecord::Base.connection_id=`.
1046
+ *Rusty Geldmacher*, *Guillermo Iguaran*
999
1047
 
1000
- *Sean Griffin*
1048
+ * Add type caster to `RuntimeReflection#alias_name`.
1001
1049
 
1002
- * Ensure hashes can be assigned to attributes created using `composed_of`.
1050
+ Fixes #28959.
1003
1051
 
1004
- Fixes #25210.
1052
+ *Jon Moss*
1005
1053
 
1006
- *Sean Griffin*
1054
+ * Deprecate `supports_statement_cache?`.
1007
1055
 
1008
- * Fix logging edge case where if an attribute was of the binary type and
1009
- was provided as a Hash.
1056
+ *Ryuta Kamizono*
1010
1057
 
1011
- *Jon Moss*
1058
+ * Raise error `UnknownMigrationVersionError` on the movement of migrations
1059
+ when the current migration does not exist.
1012
1060
 
1013
- * Handle JSON deserialization correctly if the column default from database
1014
- adapter returns `''` instead of `nil`.
1061
+ *bogdanvlviv*
1015
1062
 
1016
- *Johannes Opper*
1063
+ * Fix `bin/rails db:forward` first migration.
1017
1064
 
1018
- * Introduce new Active Record transaction error classes for catching
1019
- transaction serialization failures or deadlocks.
1065
+ *bogdanvlviv*
1020
1066
 
1021
- *Erol Fornoles*
1067
+ * Support Descending Indexes for MySQL.
1022
1068
 
1023
- * PostgreSQL: Fix `db:structure:load` silent failure on SQL error.
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
- The command line flag `-v ON_ERROR_STOP=1` should be used
1026
- when invoking `psql` to make sure errors are not suppressed.
1072
+ *Ryuta Kamizono*
1027
1073
 
1028
- Example:
1074
+ * Fix inconsistency with changed attributes when overriding Active Record attribute reader.
1029
1075
 
1030
- psql -v ON_ERROR_STOP=1 -q -f awesome-file.sql my-app-db
1076
+ *bogdanvlviv*
1031
1077
 
1032
- Fixes #23818.
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
- *Ralin Chimev*
1081
+ *Kevin McPhillips*
1035
1082
 
1036
1083
 
1037
- Please check [5-0-stable](https://github.com/rails/rails/blob/5-0-stable/activerecord/CHANGELOG.md) for previous changes.
1084
+ Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activerecord/CHANGELOG.md) for previous changes.