activerecord 5.1.7 → 5.2.4.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

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