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