activerecord 5.1.7 → 5.2.6

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