activerecord 5.2.4.4 → 6.0.0.beta1

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 (240) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +300 -725
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +1 -1
  5. data/examples/performance.rb +1 -1
  6. data/lib/active_record.rb +2 -1
  7. data/lib/active_record/aggregations.rb +4 -2
  8. data/lib/active_record/associations.rb +16 -12
  9. data/lib/active_record/associations/association.rb +35 -19
  10. data/lib/active_record/associations/association_scope.rb +4 -6
  11. data/lib/active_record/associations/belongs_to_association.rb +36 -42
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +0 -4
  13. data/lib/active_record/associations/builder/belongs_to.rb +14 -50
  14. data/lib/active_record/associations/builder/collection_association.rb +3 -3
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +17 -38
  16. data/lib/active_record/associations/collection_association.rb +11 -25
  17. data/lib/active_record/associations/collection_proxy.rb +32 -6
  18. data/lib/active_record/associations/foreign_association.rb +7 -0
  19. data/lib/active_record/associations/has_many_association.rb +1 -1
  20. data/lib/active_record/associations/has_many_through_association.rb +25 -18
  21. data/lib/active_record/associations/has_one_association.rb +28 -30
  22. data/lib/active_record/associations/has_one_through_association.rb +5 -5
  23. data/lib/active_record/associations/join_dependency.rb +15 -20
  24. data/lib/active_record/associations/join_dependency/join_association.rb +11 -26
  25. data/lib/active_record/associations/join_dependency/join_part.rb +2 -2
  26. data/lib/active_record/associations/preloader.rb +32 -29
  27. data/lib/active_record/associations/preloader/association.rb +1 -2
  28. data/lib/active_record/associations/singular_association.rb +2 -16
  29. data/lib/active_record/attribute_assignment.rb +7 -10
  30. data/lib/active_record/attribute_methods.rb +34 -56
  31. data/lib/active_record/attribute_methods/dirty.rb +64 -26
  32. data/lib/active_record/attribute_methods/primary_key.rb +8 -7
  33. data/lib/active_record/attribute_methods/read.rb +16 -48
  34. data/lib/active_record/attribute_methods/serialization.rb +1 -1
  35. data/lib/active_record/attribute_methods/time_zone_conversion.rb +1 -1
  36. data/lib/active_record/attribute_methods/write.rb +15 -16
  37. data/lib/active_record/autosave_association.rb +7 -21
  38. data/lib/active_record/base.rb +2 -2
  39. data/lib/active_record/callbacks.rb +3 -17
  40. data/lib/active_record/collection_cache_key.rb +1 -1
  41. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +13 -36
  42. data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
  43. data/lib/active_record/connection_adapters/abstract/database_statements.rb +25 -84
  44. data/lib/active_record/connection_adapters/abstract/query_cache.rb +17 -14
  45. data/lib/active_record/connection_adapters/abstract/quoting.rb +5 -11
  46. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +15 -11
  47. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +30 -13
  48. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +0 -2
  49. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +41 -27
  50. data/lib/active_record/connection_adapters/abstract/transaction.rb +81 -52
  51. data/lib/active_record/connection_adapters/abstract_adapter.rb +95 -31
  52. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +65 -90
  53. data/lib/active_record/connection_adapters/connection_specification.rb +52 -42
  54. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +5 -9
  55. data/lib/active_record/connection_adapters/mysql/database_statements.rb +29 -7
  56. data/lib/active_record/connection_adapters/mysql/quoting.rb +1 -1
  57. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +3 -4
  58. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +65 -10
  59. data/lib/active_record/connection_adapters/mysql2_adapter.rb +8 -4
  60. data/lib/active_record/connection_adapters/postgresql/column.rb +1 -2
  61. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +16 -1
  62. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
  63. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +1 -4
  64. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +1 -1
  65. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +1 -1
  66. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +1 -1
  67. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +9 -7
  68. data/lib/active_record/connection_adapters/postgresql/quoting.rb +4 -4
  69. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +11 -36
  70. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +9 -2
  71. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +38 -20
  72. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +2 -1
  73. data/lib/active_record/connection_adapters/postgresql_adapter.rb +75 -56
  74. data/lib/active_record/connection_adapters/schema_cache.rb +5 -0
  75. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +5 -5
  76. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +14 -9
  77. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +95 -62
  78. data/lib/active_record/connection_handling.rb +132 -26
  79. data/lib/active_record/core.rb +76 -43
  80. data/lib/active_record/counter_cache.rb +4 -29
  81. data/lib/active_record/database_configurations.rb +184 -0
  82. data/lib/active_record/database_configurations/database_config.rb +37 -0
  83. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  84. data/lib/active_record/database_configurations/url_config.rb +74 -0
  85. data/lib/active_record/enum.rb +22 -7
  86. data/lib/active_record/errors.rb +24 -21
  87. data/lib/active_record/explain.rb +1 -1
  88. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  89. data/lib/active_record/fixture_set/render_context.rb +17 -0
  90. data/lib/active_record/fixture_set/table_row.rb +153 -0
  91. data/lib/active_record/fixture_set/table_rows.rb +47 -0
  92. data/lib/active_record/fixtures.rb +140 -472
  93. data/lib/active_record/gem_version.rb +4 -4
  94. data/lib/active_record/inheritance.rb +12 -2
  95. data/lib/active_record/integration.rb +56 -16
  96. data/lib/active_record/internal_metadata.rb +5 -1
  97. data/lib/active_record/locking/optimistic.rb +2 -2
  98. data/lib/active_record/locking/pessimistic.rb +3 -3
  99. data/lib/active_record/log_subscriber.rb +7 -26
  100. data/lib/active_record/migration.rb +38 -37
  101. data/lib/active_record/migration/command_recorder.rb +35 -5
  102. data/lib/active_record/migration/compatibility.rb +34 -16
  103. data/lib/active_record/model_schema.rb +30 -9
  104. data/lib/active_record/nested_attributes.rb +2 -2
  105. data/lib/active_record/no_touching.rb +7 -0
  106. data/lib/active_record/persistence.rb +18 -7
  107. data/lib/active_record/query_cache.rb +11 -4
  108. data/lib/active_record/querying.rb +19 -11
  109. data/lib/active_record/railtie.rb +71 -42
  110. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  111. data/lib/active_record/railties/controller_runtime.rb +30 -35
  112. data/lib/active_record/railties/databases.rake +94 -43
  113. data/lib/active_record/reflection.rb +60 -44
  114. data/lib/active_record/relation.rb +150 -69
  115. data/lib/active_record/relation/batches.rb +13 -10
  116. data/lib/active_record/relation/calculations.rb +38 -28
  117. data/lib/active_record/relation/delegation.rb +4 -13
  118. data/lib/active_record/relation/finder_methods.rb +12 -25
  119. data/lib/active_record/relation/merger.rb +2 -6
  120. data/lib/active_record/relation/predicate_builder.rb +4 -6
  121. data/lib/active_record/relation/predicate_builder/array_handler.rb +5 -4
  122. data/lib/active_record/relation/predicate_builder/association_query_value.rb +1 -4
  123. data/lib/active_record/relation/predicate_builder/base_handler.rb +1 -2
  124. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +1 -2
  125. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +1 -4
  126. data/lib/active_record/relation/predicate_builder/range_handler.rb +3 -23
  127. data/lib/active_record/relation/query_attribute.rb +15 -12
  128. data/lib/active_record/relation/query_methods.rb +29 -52
  129. data/lib/active_record/relation/where_clause.rb +4 -0
  130. data/lib/active_record/relation/where_clause_factory.rb +1 -2
  131. data/lib/active_record/result.rb +30 -11
  132. data/lib/active_record/sanitization.rb +2 -39
  133. data/lib/active_record/schema.rb +1 -10
  134. data/lib/active_record/schema_dumper.rb +12 -6
  135. data/lib/active_record/schema_migration.rb +4 -0
  136. data/lib/active_record/scoping.rb +9 -8
  137. data/lib/active_record/scoping/default.rb +10 -3
  138. data/lib/active_record/scoping/named.rb +10 -14
  139. data/lib/active_record/statement_cache.rb +32 -5
  140. data/lib/active_record/store.rb +39 -8
  141. data/lib/active_record/table_metadata.rb +1 -4
  142. data/lib/active_record/tasks/database_tasks.rb +89 -23
  143. data/lib/active_record/tasks/mysql_database_tasks.rb +2 -4
  144. data/lib/active_record/tasks/postgresql_database_tasks.rb +5 -7
  145. data/lib/active_record/tasks/sqlite_database_tasks.rb +2 -8
  146. data/lib/active_record/test_databases.rb +38 -0
  147. data/lib/active_record/test_fixtures.rb +224 -0
  148. data/lib/active_record/timestamp.rb +4 -6
  149. data/lib/active_record/transactions.rb +3 -22
  150. data/lib/active_record/translation.rb +1 -1
  151. data/lib/active_record/type.rb +3 -4
  152. data/lib/active_record/type/adapter_specific_registry.rb +1 -8
  153. data/lib/active_record/type_caster/connection.rb +1 -6
  154. data/lib/active_record/type_caster/map.rb +1 -4
  155. data/lib/active_record/validations/uniqueness.rb +13 -25
  156. data/lib/arel.rb +44 -0
  157. data/lib/arel/alias_predication.rb +9 -0
  158. data/lib/arel/attributes.rb +22 -0
  159. data/lib/arel/attributes/attribute.rb +37 -0
  160. data/lib/arel/collectors/bind.rb +24 -0
  161. data/lib/arel/collectors/composite.rb +31 -0
  162. data/lib/arel/collectors/plain_string.rb +20 -0
  163. data/lib/arel/collectors/sql_string.rb +20 -0
  164. data/lib/arel/collectors/substitute_binds.rb +28 -0
  165. data/lib/arel/crud.rb +42 -0
  166. data/lib/arel/delete_manager.rb +18 -0
  167. data/lib/arel/errors.rb +9 -0
  168. data/lib/arel/expressions.rb +29 -0
  169. data/lib/arel/factory_methods.rb +49 -0
  170. data/lib/arel/insert_manager.rb +49 -0
  171. data/lib/arel/math.rb +45 -0
  172. data/lib/arel/nodes.rb +67 -0
  173. data/lib/arel/nodes/and.rb +32 -0
  174. data/lib/arel/nodes/ascending.rb +23 -0
  175. data/lib/arel/nodes/binary.rb +52 -0
  176. data/lib/arel/nodes/bind_param.rb +36 -0
  177. data/lib/arel/nodes/case.rb +55 -0
  178. data/lib/arel/nodes/casted.rb +50 -0
  179. data/lib/arel/nodes/count.rb +12 -0
  180. data/lib/arel/nodes/delete_statement.rb +45 -0
  181. data/lib/arel/nodes/descending.rb +23 -0
  182. data/lib/arel/nodes/equality.rb +18 -0
  183. data/lib/arel/nodes/extract.rb +24 -0
  184. data/lib/arel/nodes/false.rb +16 -0
  185. data/lib/arel/nodes/full_outer_join.rb +8 -0
  186. data/lib/arel/nodes/function.rb +44 -0
  187. data/lib/arel/nodes/grouping.rb +8 -0
  188. data/lib/arel/nodes/in.rb +8 -0
  189. data/lib/arel/nodes/infix_operation.rb +80 -0
  190. data/lib/arel/nodes/inner_join.rb +8 -0
  191. data/lib/arel/nodes/insert_statement.rb +37 -0
  192. data/lib/arel/nodes/join_source.rb +20 -0
  193. data/lib/arel/nodes/matches.rb +18 -0
  194. data/lib/arel/nodes/named_function.rb +23 -0
  195. data/lib/arel/nodes/node.rb +50 -0
  196. data/lib/arel/nodes/node_expression.rb +13 -0
  197. data/lib/arel/nodes/outer_join.rb +8 -0
  198. data/lib/arel/nodes/over.rb +15 -0
  199. data/lib/arel/nodes/regexp.rb +16 -0
  200. data/lib/arel/nodes/right_outer_join.rb +8 -0
  201. data/lib/arel/nodes/select_core.rb +63 -0
  202. data/lib/arel/nodes/select_statement.rb +41 -0
  203. data/lib/arel/nodes/sql_literal.rb +16 -0
  204. data/lib/arel/nodes/string_join.rb +11 -0
  205. data/lib/arel/nodes/table_alias.rb +27 -0
  206. data/lib/arel/nodes/terminal.rb +16 -0
  207. data/lib/arel/nodes/true.rb +16 -0
  208. data/lib/arel/nodes/unary.rb +44 -0
  209. data/lib/arel/nodes/unary_operation.rb +20 -0
  210. data/lib/arel/nodes/unqualified_column.rb +22 -0
  211. data/lib/arel/nodes/update_statement.rb +41 -0
  212. data/lib/arel/nodes/values.rb +16 -0
  213. data/lib/arel/nodes/values_list.rb +24 -0
  214. data/lib/arel/nodes/window.rb +126 -0
  215. data/lib/arel/nodes/with.rb +11 -0
  216. data/lib/arel/order_predications.rb +13 -0
  217. data/lib/arel/predications.rb +257 -0
  218. data/lib/arel/select_manager.rb +271 -0
  219. data/lib/arel/table.rb +110 -0
  220. data/lib/arel/tree_manager.rb +72 -0
  221. data/lib/arel/update_manager.rb +34 -0
  222. data/lib/arel/visitors.rb +20 -0
  223. data/lib/arel/visitors/depth_first.rb +199 -0
  224. data/lib/arel/visitors/dot.rb +292 -0
  225. data/lib/arel/visitors/ibm_db.rb +21 -0
  226. data/lib/arel/visitors/informix.rb +56 -0
  227. data/lib/arel/visitors/mssql.rb +143 -0
  228. data/lib/arel/visitors/mysql.rb +83 -0
  229. data/lib/arel/visitors/oracle.rb +159 -0
  230. data/lib/arel/visitors/oracle12.rb +67 -0
  231. data/lib/arel/visitors/postgresql.rb +116 -0
  232. data/lib/arel/visitors/sqlite.rb +39 -0
  233. data/lib/arel/visitors/to_sql.rb +913 -0
  234. data/lib/arel/visitors/visitor.rb +42 -0
  235. data/lib/arel/visitors/where_sql.rb +23 -0
  236. data/lib/arel/window_predications.rb +9 -0
  237. data/lib/rails/generators/active_record/migration.rb +14 -1
  238. data/lib/rails/generators/active_record/migration/migration_generator.rb +2 -5
  239. data/lib/rails/generators/active_record/model/model_generator.rb +1 -0
  240. metadata +104 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b371eab07ad19fdba3131ea0100df91b8b6b86cc95456d9a3499a6b872a2cd47
4
- data.tar.gz: 83e774333487bd4f05ca4b33bcba5d3856a76deb08a1b9e8a2ab15a6dada07b6
3
+ metadata.gz: 3c6ced19e10b6f6d4eb33ac9745ce89e3b4ee124c02080e582abe07b9e5ac9a6
4
+ data.tar.gz: d0267bc9be2b86eea525eebd296a3eba6dd098ae154c6ec6b91978164e91a898
5
5
  SHA512:
6
- metadata.gz: f90b220a5a56487c855b7ce357103e81933cbf8526aa5d166c89eb245d310a8e878104e553d6026881471c1d1fd79aad212651dc3a2f3a2b9d538c848156d175
7
- data.tar.gz: def00b3f9d09476467c13b4df9ee720264f542b828a520f220688a3d1368d948cf2feba8a06ea4df87de0fbc617104e1928ab1ffa9e1c022cd86f97818feb031
6
+ metadata.gz: 0fa88cf19b4df3cafcb246c31b104bc0df9a231f131d8c046fa20adb20f06285da1379a55ee82b3ef18e313212b4ae88f8f35752ae99bffcd0e669ca6f255b1d
7
+ data.tar.gz: 37f5229326765cb0c16f1501c4f3ade8594166a7999402f1016e23dfc9ec01ca009fa6abaf6e0751e288d533393592fe1db64fd0301c1ae1e1bfe5ff4c08d010
@@ -1,79 +1,80 @@
1
- ## Rails 5.2.4.4 (September 09, 2020) ##
1
+ ## Rails 6.0.0.beta1 (January 18, 2019) ##
2
2
 
3
- * No changes.
3
+ * Remove deprecated `#set_state` from the transaction object.
4
4
 
5
+ *Rafael Mendonça França*
5
6
 
6
- ## Rails 5.2.4.3 (May 18, 2020) ##
7
+ * Remove deprecated `#supports_statement_cache?` from the database adapters.
7
8
 
8
- * No changes.
9
+ *Rafael Mendonça França*
9
10
 
11
+ * Remove deprecated `#insert_fixtures` from the database adapters.
10
12
 
11
- ## Rails 5.2.4.1 (December 18, 2019) ##
13
+ *Rafael Mendonça França*
12
14
 
13
- * No changes.
15
+ * Remove deprecated `ActiveRecord::ConnectionAdapters::SQLite3Adapter#valid_alter_table_type?`.
14
16
 
17
+ *Rafael Mendonça França*
15
18
 
16
- ## Rails 5.2.4 (November 27, 2019) ##
19
+ * Do not allow passing the column name to `sum` when a block is passed.
17
20
 
18
- * Fix circular `autosave: true` causes invalid records to be saved.
21
+ *Rafael Mendonça França*
19
22
 
20
- Prior to the fix, when there was a circular series of `autosave: true`
21
- associations, the callback for a `has_many` association was run while
22
- another instance of the same callback on the same association hadn't
23
- finished running. When control returned to the first instance of the
24
- callback, the instance variable had changed, and subsequent associated
25
- records weren't saved correctly. Specifically, the ID field for the
26
- `belongs_to` corresponding to the `has_many` was `nil`.
23
+ * Do not allow passing the column name to `count` when a block is passed.
27
24
 
28
- Fixes #28080.
25
+ *Rafael Mendonça França*
29
26
 
30
- *Larry Reid*
27
+ * Remove delegation of missing methods in a relation to arel.
31
28
 
32
- * PostgreSQL: Fix GROUP BY with ORDER BY virtual count attribute.
29
+ *Rafael Mendonça França*
33
30
 
34
- Fixes #36022.
31
+ * Remove delegation of missing methods in a relation to private methods of the class.
35
32
 
36
- *Ryuta Kamizono*
33
+ *Rafael Mendonça França*
37
34
 
38
- * Fix sqlite3 collation parsing when using decimal columns.
35
+ * Deprecate `config.activerecord.sqlite3.represent_boolean_as_integer`.
39
36
 
40
- *Martin R. Schuster*
37
+ *Rafael Mendonça França*
41
38
 
42
- * Make ActiveRecord `ConnectionPool.connections` method thread-safe.
39
+ * Change `SQLite3Adapter` to always represent boolean values as integers.
43
40
 
44
- Fixes #36465.
41
+ *Rafael Mendonça França*
45
42
 
46
- *Jeff Doering*
43
+ * Remove ability to specify a timestamp name for `#cache_key`.
47
44
 
48
- * Assign all attributes before calling `build` to ensure the child record is visible in
49
- `before_add` and `after_add` callbacks for `has_many :through` associations.
45
+ *Rafael Mendonça França*
50
46
 
51
- Fixes #33249.
47
+ * Remove deprecated `ActiveRecord::Migrator.migrations_path=`.
52
48
 
53
- *Ryan H. Kerr*
49
+ *Rafael Mendonça França*
54
50
 
51
+ * Remove deprecated `expand_hash_conditions_for_aggregates`.
55
52
 
56
- ## Rails 5.2.3 (March 27, 2019) ##
53
+ *Rafael Mendonça França*
57
54
 
58
- * Fix different `count` calculation when using `size` with manual `select` with DISTINCT.
55
+ * Set polymorphic type column to NULL on `dependent: :nullify` strategy.
59
56
 
60
- Fixes #35214.
57
+ On polymorphic associations both the foreign key and the foreign type columns will be set to NULL.
61
58
 
62
- *Juani Villarejo*
59
+ *Laerti Papa*
63
60
 
64
- * Fix prepared statements caching to be enabled even when query caching is enabled.
61
+ * Allow permitted instance of `ActionController::Parameters` as argument of `ActiveRecord::Relation#exists?`.
65
62
 
66
- *Ryuta Kamizono*
63
+ *Gannon McGibbon*
67
64
 
68
- * Don't allow `where` with invalid value matches to nil values.
65
+ * Add support for endless ranges introduces in Ruby 2.6.
69
66
 
70
- Fixes #33624.
67
+ *Greg Navis*
68
+
69
+ * Deprecate passing `migrations_paths` to `connection.assume_migrated_upto_version`.
71
70
 
72
71
  *Ryuta Kamizono*
73
72
 
74
- * Restore an ability that class level `update` without giving ids.
73
+ * MySQL: `ROW_FORMAT=DYNAMIC` create table option by default.
75
74
 
76
- Fixes #34743.
75
+ Since MySQL 5.7.9, the `innodb_default_row_format` option defines the default row
76
+ format for InnoDB tables. The default setting is `DYNAMIC`.
77
+ The row format is required for indexing on `varchar(255)` with `utf8mb4` columns.
77
78
 
78
79
  *Ryuta Kamizono*
79
80
 
@@ -81,6 +82,10 @@
81
82
 
82
83
  *Gannon McGibbon*
83
84
 
85
+ * Allow disabling scopes generated by `ActiveRecord.enum`.
86
+
87
+ *Alfred Dominic*
88
+
84
89
  * Ensure that `delete_all` on collection proxy returns affected count.
85
90
 
86
91
  *Ryuta Kamizono*
@@ -89,17 +94,21 @@
89
94
 
90
95
  *Gannon McGibbon*
91
96
 
97
+ * Add the ability to prevent writes to a database for the duration of a block.
92
98
 
93
- ## Rails 5.2.2.1 (March 11, 2019) ##
94
-
95
- * No changes.
99
+ Allows the application to prevent writes to a database. This can be useful when
100
+ you're building out multiple databases and want to make sure you're not sending
101
+ writes when you want a read.
96
102
 
103
+ If `while_preventing_writes` is called and the query is considered a write
104
+ query the database will raise an exception regardless of whether the database
105
+ user is able to write.
97
106
 
98
- ## Rails 5.2.2 (December 04, 2018) ##
107
+ This is not meant to be a catch-all for write queries but rather a way to enforce
108
+ read-only queries without opening a second connection. One purpose of this is to
109
+ catch accidental writes, not all writes.
99
110
 
100
- * Do not ignore the scoping with query methods in the scope block.
101
-
102
- *Ryuta Kamizono*
111
+ *Eileen M. Uchitelle*
103
112
 
104
113
  * Allow aliased attributes to be used in `#update_columns` and `#update`.
105
114
 
@@ -107,8 +116,7 @@
107
116
 
108
117
  * Allow spaces in postgres table names.
109
118
 
110
- Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres
111
- adapter.
119
+ Fixes issue where "user post" is misinterpreted as "\"user\".\"post\"" when quoting table names with the postgres adapter.
112
120
 
113
121
  *Gannon McGibbon*
114
122
 
@@ -141,852 +149,419 @@
141
149
 
142
150
  *Dmitry Tsepelev*
143
151
 
144
- * Values of enum are frozen, raising an error when attempting to modify them.
145
-
146
- *Emmanuel Byrd*
147
-
148
- * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
149
- if the attribute does not exist.
150
-
151
- *Sean Griffin*
152
-
153
- * Do not use prepared statement in queries that have a large number of binds.
154
-
155
- *Ryuta Kamizono*
156
-
157
- * Fix query cache to load before first request.
158
-
159
- *Eileen M. Uchitelle*
160
-
161
- * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
162
-
163
- Fixes #33056.
164
-
165
- *Federico Martinez*
166
-
167
- * Fix duplicated record creation when using nested attributes with `create_with`.
168
-
169
- *Darwin Wu*
170
-
171
- * Fix regression setting children record in parent `before_save` callback.
172
-
173
- *Guo Xiang Tan*
174
-
175
- * Prevent leaking of user's DB credentials on `rails db:create` failure.
176
-
177
- *bogdanvlviv*
178
-
179
- * Clear mutation tracker before continuing the around callbacks.
180
-
181
- *Yuya Tanaka*
182
-
183
- * Prevent deadlocks when waiting for connection from pool.
184
-
185
- *Brent Wheeldon*
186
-
187
- * Avoid extra scoping when using `Relation#update` that was causing this method to change the current scope.
188
-
189
- *Ryuta Kamizono*
190
-
191
- * Fix numericality validator not to be affected by custom getter.
192
-
193
- *Ryuta Kamizono*
194
-
195
- * Fix bulk change table ignores comment option on PostgreSQL.
152
+ * Make the implicit order column configurable.
196
153
 
197
- *Yoshiyuki Kinjo*
198
-
199
-
200
- ## Rails 5.2.1.1 (November 27, 2018) ##
201
-
202
- * No changes.
203
-
204
-
205
- ## Rails 5.2.1 (August 07, 2018) ##
206
-
207
- * PostgreSQL: Support new relkind for partitioned tables.
208
-
209
- Fixes #33008.
210
-
211
- *Yannick Schutz*
212
-
213
- * Rollback parent transaction when children fails to update.
214
-
215
- *Guillaume Malette*
216
-
217
- * Fix default value for MySQL time types with specified precision.
218
-
219
- *Nikolay Kondratyev*
220
-
221
- * Fix `touch` option to behave consistently with `Persistence#touch` method.
222
-
223
- *Ryuta Kamizono*
224
-
225
- * Fix `save` in `after_create_commit` won't invoke extra `after_create_commit`.
226
-
227
- Fixes #32831.
228
-
229
- *Ryuta Kamizono*
154
+ When calling ordered finder methods such as +first+ or +last+ without an
155
+ explicit order clause, ActiveRecord sorts records by primary key. This can
156
+ result in unpredictable and surprising behaviour when the primary key is
157
+ not an auto-incrementing integer, for example when it's a UUID. This change
158
+ makes it possible to override the column used for implicit ordering such
159
+ that +first+ and +last+ will return more predictable results.
230
160
 
231
- * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
232
-
233
- *Brian Durand*
234
-
235
- * Fix parent record should not get saved with duplicate children records.
236
-
237
- Fixes #32940.
238
-
239
- *Santosh Wadghule*
240
-
241
- * Fix that association's after_touch is not called with counter cache.
242
-
243
- Fixes #31559.
244
-
245
- *Ryuta Kamizono*
246
-
247
- * `becomes` should clear the mutation tracker which is created in `after_initialize`.
248
-
249
- Fixes #32867.
250
-
251
- *Ryuta Kamizono*
252
-
253
- * Allow a belonging to parent object to be created from a new record.
254
-
255
- *Jolyon Pawlyn*
256
-
257
- * Fix that building record with assigning multiple has_one associations
258
- wrongly persists through record.
259
-
260
- Fixes #32511.
261
-
262
- *Sam DeCesare*
263
-
264
- * Fix relation merging when one of the relations is going to skip the
265
- query cache.
266
-
267
- *James Williams*
268
-
269
-
270
- ## Rails 5.2.0 (April 09, 2018) ##
271
-
272
- * MySQL: Support mysql2 0.5.x.
273
-
274
- *Aaron Stone*
275
-
276
- * Apply time column precision on assignment.
277
-
278
- PR #20317 changed the behavior of datetime columns so that when they
279
- have a specified precision then on assignment the value is rounded to
280
- that precision. This behavior is now applied to time columns as well.
281
-
282
- Fixes #30301.
283
-
284
- *Andrew White*
285
-
286
- * Normalize time column values for SQLite database.
287
-
288
- For legacy reasons, time columns in SQLite are stored as full datetimes
289
- because until #24542 the quoting for time columns didn't remove the date
290
- component. To ensure that values are consistent we now normalize the
291
- date component to 2001-01-01 on reading and writing.
292
-
293
- *Andrew White*
294
-
295
- * Ensure that the date component is removed when quoting times.
296
-
297
- PR #24542 altered the quoting for time columns so that the date component
298
- was removed however it only removed it when it was 2001-01-01. Now the
299
- date component is removed irrespective of what the date is.
300
-
301
- *Andrew White*
302
-
303
- * Fix `dependent: :destroy` issue for has_one/belongs_to relationship where
304
- the parent class was getting deleted when the child was not.
305
-
306
- Fixes #32022.
307
-
308
- *Fernando Gorodscy*
309
-
310
- * Whitelist `NULLS FIRST` and `NULLS LAST` in order clauses too.
311
-
312
- *Xavier Noria*
313
-
314
- * Fix that after commit callbacks on update does not triggered when optimistic locking is enabled.
315
-
316
- *Ryuta Kamizono*
161
+ Example:
317
162
 
318
- * Fix `#columns_for_distinct` of MySQL and PostgreSQL to make
319
- `ActiveRecord::FinderMethods#limited_ids_for` use correct primary key values
320
- even if `ORDER BY` columns include other table's primary key.
163
+ class Project < ActiveRecord::Base
164
+ self.implicit_order_column = "created_at"
165
+ end
321
166
 
322
- Fixes #28364.
167
+ *Tekin Suleyman*
323
168
 
324
- *Takumi Kagiyama*
169
+ * Bump minimum PostgreSQL version to 9.3.
325
170
 
326
- * Make `reflection.klass` raise if `polymorphic?` not to be misused.
171
+ *Yasuo Honda*
327
172
 
328
- Fixes #31876.
173
+ * Values of enum are frozen, raising an error when attempting to modify them.
329
174
 
330
- *Ryuta Kamizono*
175
+ *Emmanuel Byrd*
331
176
 
332
- * PostgreSQL: Allow pg-1.0 gem to be used with Active Record.
177
+ * Move `ActiveRecord::StatementInvalid` SQL to error property and include binds as separate error property.
333
178
 
334
- *Lars Kanis*
179
+ `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception_class` now requires `binds` to be passed as the last argument.
335
180
 
336
- * Deprecate `expand_hash_conditions_for_aggregates` without replacement.
337
- Using a `Relation` for performing queries is the prefered API.
181
+ `ActiveRecord::ConnectionAdapters::AbstractAdapter#translate_exception` now requires `message`, `sql`, and `binds` to be passed as keyword arguments.
338
182
 
339
- *Ryuta Kamizono*
183
+ Subclasses of `ActiveRecord::StatementInvalid` must now provide `sql:` and `binds:` arguments to `super`.
340
184
 
341
- * Fix not expanded problem when passing an Array object as argument to the where method using `composed_of` column.
185
+ Example:
342
186
 
343
187
  ```
344
- david_balance = customers(:david).balance
345
- Customer.where(balance: [david_balance]).to_sql
346
-
347
- # Before: WHERE `customers`.`balance` = NULL
348
- # After : WHERE `customers`.`balance` = 50
188
+ class MySubclassedError < ActiveRecord::StatementInvalid
189
+ def initialize(message, sql:, binds:)
190
+ super(message, sql: sql, binds: binds)
191
+ end
192
+ end
349
193
  ```
350
194
 
351
- Fixes #31723.
352
-
353
- *Yutaro Kanagawa*
354
-
355
- * Fix `count(:all)` with eager loading and having an order other than the driving table.
356
-
357
- Fixes #31783.
358
-
359
- *Ryuta Kamizono*
360
-
361
- * Clear the transaction state when an Active Record object is duped.
362
-
363
- Fixes #31670.
364
-
365
- *Yuriy Ustushenko*
366
-
367
- * Support for PostgreSQL foreign tables.
368
-
369
- *fatkodima*
370
-
371
- * Fix relation merger issue with `left_outer_joins`.
372
-
373
- *Mehmet Emin İNAÇ*
374
-
375
- * Don't allow destroyed object mutation after `save` or `save!` is called.
376
-
377
- *Ryuta Kamizono*
378
-
379
- * Take into account association conditions when deleting through records.
380
-
381
- Fixes #18424.
382
-
383
- *Piotr Jakubowski*
195
+ *Gannon McGibbon*
384
196
 
385
- * Fix nested `has_many :through` associations on unpersisted parent instances.
197
+ * Add an `:if_not_exists` option to `create_table`.
386
198
 
387
- For example, if you have
199
+ Example:
388
200
 
389
- class Post < ActiveRecord::Base
390
- belongs_to :author
391
- has_many :books, through: :author
392
- has_many :subscriptions, through: :books
201
+ create_table :posts, if_not_exists: true do |t|
202
+ t.string :title
393
203
  end
394
204
 
395
- class Author < ActiveRecord::Base
396
- has_one :post
397
- has_many :books
398
- has_many :subscriptions, through: :books
399
- end
205
+ That would execute:
400
206
 
401
- class Book < ActiveRecord::Base
402
- belongs_to :author
403
- has_many :subscriptions
404
- end
207
+ CREATE TABLE IF NOT EXISTS posts (
208
+ ...
209
+ )
405
210
 
406
- class Subscription < ActiveRecord::Base
407
- belongs_to :book
408
- end
211
+ If the table already exists, `if_not_exists: false` (the default) raises an
212
+ exception whereas `if_not_exists: true` does nothing.
409
213
 
410
- Before:
214
+ *fatkodima*, *Stefan Kanev*
411
215
 
412
- If `post` is not persisted, then `post.subscriptions` will be empty.
216
+ * Defining an Enum as a Hash with blank key, or as an Array with a blank value, now raises an `ArgumentError`.
413
217
 
414
- After:
218
+ *Christophe Maximin*
415
219
 
416
- If `post` is not persisted, then `post.subscriptions` can be set and used
417
- just like it would if `post` were persisted.
220
+ * Adds support for multiple databases to `rails db:schema:cache:dump` and `rails db:schema:cache:clear`.
418
221
 
419
- Fixes #16313.
222
+ *Gannon McGibbon*
420
223
 
421
- *Zoltan Kiss*
224
+ * `update_columns` now correctly raises `ActiveModel::MissingAttributeError`
225
+ if the attribute does not exist.
422
226
 
423
- * Fixed inconsistency with `first(n)` when used with `limit()`.
424
- The `first(n)` finder now respects the `limit()`, making it consistent
425
- with `relation.to_a.first(n)`, and also with the behavior of `last(n)`.
227
+ *Sean Griffin*
426
228
 
427
- Fixes #23979.
229
+ * Add support for hash and url configs in database hash of `ActiveRecord::Base.connected_to`.
428
230
 
429
- *Brian Christian*
231
+ ````
232
+ User.connected_to(database: { writing: "postgres://foo" }) do
233
+ User.create!(name: "Gannon")
234
+ end
430
235
 
431
- * Use `count(:all)` in `HasManyAssociation#count_records` to prevent invalid
432
- SQL queries for association counting.
236
+ config = { "adapter" => "sqlite3", "database" => "db/readonly.sqlite3" }
237
+ User.connected_to(database: { reading: config }) do
238
+ User.count
239
+ end
240
+ ````
433
241
 
434
- *Klas Eskilson*
242
+ *Gannon McGibbon*
435
243
 
436
- * Fix to invoke callbacks when using `update_attribute`.
244
+ * Support default expression for MySQL.
437
245
 
438
- *Mike Busch*
246
+ MySQL 8.0.13 and higher supports default value to be a function or expression.
439
247
 
440
- * Fix `count(:all)` to correctly work `distinct` with custom SELECT list.
248
+ https://dev.mysql.com/doc/refman/8.0/en/create-table.html
441
249
 
442
250
  *Ryuta Kamizono*
443
251
 
444
- * Using subselect for `delete_all` with `limit` or `offset`.
252
+ * Support expression indexes for MySQL.
445
253
 
446
- *Ryuta Kamizono*
254
+ MySQL 8.0.13 and higher supports functional key parts that index
255
+ expression values rather than column or column prefix values.
447
256
 
448
- * Undefine attribute methods on descendants when resetting column
449
- information.
257
+ https://dev.mysql.com/doc/refman/8.0/en/create-index.html
450
258
 
451
- *Chris Salzberg*
259
+ *Ryuta Kamizono*
452
260
 
453
- * Log database query callers.
261
+ * Fix collection cache key with limit and custom select to avoid ambiguous timestamp column error.
454
262
 
455
- Add `verbose_query_logs` configuration option to display the caller
456
- of database queries in the log to facilitate N+1 query resolution
457
- and other debugging.
263
+ Fixes #33056.
458
264
 
459
- Enabled in development only for new and upgraded applications. Not
460
- recommended for use in the production environment since it relies
461
- on Ruby's `Kernel#caller_locations` which is fairly slow.
265
+ *Federico Martinez*
462
266
 
463
- *Olivier Lacan*
267
+ * Add basic API for connection switching to support multiple databases.
464
268
 
465
- * Fix conflicts `counter_cache` with `touch: true` by optimistic locking.
269
+ 1) Adds a `connects_to` method for models to connect to multiple databases. Example:
466
270
 
467
271
  ```
468
- # create_table :posts do |t|
469
- # t.integer :comments_count, default: 0
470
- # t.integer :lock_version
471
- # t.timestamps
472
- # end
473
- class Post < ApplicationRecord
272
+ class AnimalsModel < ApplicationRecord
273
+ self.abstract_class = true
274
+
275
+ connects_to database: { writing: :animals_primary, reading: :animals_replica }
474
276
  end
475
277
 
476
- # create_table :comments do |t|
477
- # t.belongs_to :post
478
- # end
479
- class Comment < ApplicationRecord
480
- belongs_to :post, touch: true, counter_cache: true
278
+ class Dog < AnimalsModel
279
+ # connected to both the animals_primary db for writing and the animals_replica for reading
481
280
  end
482
281
  ```
483
282
 
484
- Before:
283
+ 2) Adds a `connected_to` block method for switching connection roles or connecting to
284
+ a database that the model didn't connect to. Connecting to the database in this block is
285
+ useful when you have another defined connection, for example `slow_replica` that you don't
286
+ want to connect to by default but need in the console, or a specific code block.
287
+
485
288
  ```
486
- post = Post.create!
487
- # => begin transaction
488
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
489
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
490
- commit transaction
491
-
492
- comment = Comment.create!(post: post)
493
- # => begin transaction
494
- INSERT INTO "comments" ("post_id") VALUES (1)
495
-
496
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
497
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
498
-
499
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:27:11.398330',
500
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
501
- rollback transaction
502
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
503
-
504
- Comment.take.destroy!
505
- # => begin transaction
506
- DELETE FROM "comments" WHERE "comments"."id" = 1
507
-
508
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
509
- "lock_version" = COALESCE("lock_version", 0) + 1 WHERE "posts"."id" = 1
510
-
511
- UPDATE "posts" SET "updated_at" = '2017-12-11 21:42:47.785901',
512
- "lock_version" = 1 WHERE "posts"."id" = 1 AND "posts"."lock_version" = 0
513
- rollback transaction
514
- # => ActiveRecord::StaleObjectError: Attempted to touch a stale object: Post.
289
+ ActiveRecord::Base.connected_to(role: :reading) do
290
+ Dog.first # finds dog from replica connected to AnimalsBase
291
+ Book.first # doesn't have a reading connection, will raise an error
292
+ end
515
293
  ```
516
294
 
517
- After:
518
295
  ```
519
- post = Post.create!
520
- # => begin transaction
521
- INSERT INTO "posts" ("created_at", "updated_at", "lock_version")
522
- VALUES ("2017-12-11 21:27:11.387397", "2017-12-11 21:27:11.387397", 0)
523
- commit transaction
524
-
525
- comment = Comment.create!(post: post)
526
- # => begin transaction
527
- INSERT INTO "comments" ("post_id") VALUES (1)
528
-
529
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) + 1,
530
- "lock_version" = COALESCE("lock_version", 0) + 1,
531
- "updated_at" = '2017-12-11 21:37:09.802642' WHERE "posts"."id" = 1
532
- commit transaction
533
-
534
- comment.destroy!
535
- # => begin transaction
536
- DELETE FROM "comments" WHERE "comments"."id" = 1
537
-
538
- UPDATE "posts" SET "comments_count" = COALESCE("comments_count", 0) - 1,
539
- "lock_version" = COALESCE("lock_version", 0) + 1,
540
- "updated_at" = '2017-12-11 21:39:02.685520' WHERE "posts"."id" = 1
541
- commit transaction
296
+ ActiveRecord::Base.connected_to(database: :slow_replica) do
297
+ SlowReplicaModel.first # if the db config has a slow_replica configuration this will be used to do the lookup, otherwise this will throw an exception
298
+ end
542
299
  ```
543
300
 
544
- Fixes #31199.
545
-
546
- *bogdanvlviv*
547
-
548
- * Add support for PostgreSQL operator classes to `add_index`.
549
-
550
- Example:
551
-
552
- add_index :users, :name, using: :gist, opclass: { name: :gist_trgm_ops }
553
-
554
- *Greg Navis*
555
-
556
- * Don't allow scopes to be defined which conflict with instance methods on `Relation`.
557
-
558
- Fixes #31120.
559
-
560
- *kinnrot*
301
+ *Eileen M. Uchitelle*
561
302
 
562
- * Add new error class `QueryCanceled` which will be raised
563
- when canceling statement due to user request.
303
+ * Enum raises on invalid definition values
564
304
 
565
- *Ryuta Kamizono*
305
+ When defining a Hash enum it can be easy to use [] instead of {}. This
306
+ commit checks that only valid definition values are provided, those can
307
+ be a Hash, an array of Symbols or an array of Strings. Otherwise it
308
+ raises an ArgumentError.
566
309
 
567
- * Add `#up_only` to database migrations for code that is only relevant when
568
- migrating up, e.g. populating a new column.
310
+ Fixes #33961
569
311
 
570
- *Rich Daley*
312
+ *Alberto Almagro*
571
313
 
572
- * Require raw SQL fragments to be explicitly marked when used in
573
- relation query methods.
314
+ * Reloading associations now clears the Query Cache like `Persistence#reload` does.
574
315
 
575
- Before:
576
- ```
577
- Article.order("LENGTH(title)")
578
316
  ```
317
+ class Post < ActiveRecord::Base
318
+ has_one :category
319
+ belongs_to :author
320
+ has_many :comments
321
+ end
579
322
 
580
- After:
581
- ```
582
- Article.order(Arel.sql("LENGTH(title)"))
583
- ```
584
-
585
- This prevents SQL injection if applications use the [strongly
586
- discouraged] form `Article.order(params[:my_order])`, under the
587
- mistaken belief that only column names will be accepted.
588
-
589
- Raw SQL strings will now cause a deprecation warning, which will
590
- become an UnknownAttributeReference error in Rails 6.0. Applications
591
- can opt in to the future behavior by setting `allow_unsafe_raw_sql`
592
- to `:disabled`.
593
-
594
- Common and judged-safe string values (such as simple column
595
- references) are unaffected:
323
+ # Each of the following will now clear the query cache.
324
+ post.reload_category
325
+ post.reload_author
326
+ post.comments.reload
596
327
  ```
597
- Article.order("title DESC")
598
- ```
599
-
600
- *Ben Toews*
601
-
602
- * `update_all` will now pass its values to `Type#cast` before passing them to
603
- `Type#serialize`. This means that `update_all(foo: 'true')` will properly
604
- persist a boolean.
605
-
606
- *Sean Griffin*
607
-
608
- * Add new error class `StatementTimeout` which will be raised
609
- when statement timeout exceeded.
610
-
611
- *Ryuta Kamizono*
612
-
613
- * Fix `bin/rails db:migrate` with specified `VERSION`.
614
- `bin/rails db:migrate` with empty VERSION behaves as without `VERSION`.
615
- Check a format of `VERSION`: Allow a migration version number
616
- or name of a migration file. Raise error if format of `VERSION` is invalid.
617
- Raise error if target migration doesn't exist.
618
-
619
- *bogdanvlviv*
620
328
 
621
- * Fixed a bug where column orders for an index weren't written to
622
- `db/schema.rb` when using the sqlite adapter.
329
+ *Christophe Maximin*
623
330
 
624
- Fixes #30902.
331
+ * Added `index` option for `change_table` migration helpers.
332
+ With this change you can create indexes while adding new
333
+ columns into the existing tables.
625
334
 
626
- *Paul Kuruvilla*
627
-
628
- * Remove deprecated method `#sanitize_conditions`.
629
-
630
- *Rafael Mendonça França*
631
-
632
- * Remove deprecated method `#scope_chain`.
633
-
634
- *Rafael Mendonça França*
635
-
636
- * Remove deprecated configuration `.error_on_ignored_order_or_limit`.
637
-
638
- *Rafael Mendonça França*
639
-
640
- * Remove deprecated arguments from `#verify!`.
641
-
642
- *Rafael Mendonça França*
643
-
644
- * Remove deprecated argument `name` from `#indexes`.
645
-
646
- *Rafael Mendonça França*
647
-
648
- * Remove deprecated method `ActiveRecord::Migrator.schema_migrations_table_name`.
649
-
650
- *Rafael Mendonça França*
335
+ Example:
651
336
 
652
- * Remove deprecated method `supports_primary_key?`.
337
+ change_table(:languages) do |t|
338
+ t.string :country_code, index: true
339
+ end
653
340
 
654
- *Rafael Mendonça França*
341
+ *Mehmet Emin İNAÇ*
655
342
 
656
- * Remove deprecated method `supports_migrations?`.
343
+ * Fix `transaction` reverting for migrations.
657
344
 
658
- *Rafael Mendonça França*
345
+ Before: Commands inside a `transaction` in a reverted migration ran uninverted.
346
+ Now: This change fixes that by reverting commands inside `transaction` block.
659
347
 
660
- * Remove deprecated methods `initialize_schema_migrations_table` and `initialize_internal_metadata_table`.
348
+ *fatkodima*, *David Verhasselt*
661
349
 
662
- *Rafael Mendonça França*
350
+ * Raise an error instead of scanning the filesystem root when `fixture_path` is blank.
663
351
 
664
- * Raises when calling `lock!` in a dirty record.
352
+ *Gannon McGibbon*, *Max Albrecht*
665
353
 
666
- *Rafael Mendonça França*
354
+ * Allow `ActiveRecord::Base.configurations=` to be set with a symbolized hash.
667
355
 
668
- * Remove deprecated support to passing a class to `:class_name` on associations.
356
+ *Gannon McGibbon*
669
357
 
670
- *Rafael Mendonça França*
358
+ * Don't update counter cache unless the record is actually saved.
671
359
 
672
- * Remove deprecated argument `default` from `index_name_exists?`.
360
+ Fixes #31493, #33113, #33117.
673
361
 
674
- *Rafael Mendonça França*
362
+ *Ryuta Kamizono*
675
363
 
676
- * Remove deprecated support to `quoted_id` when typecasting an Active Record object.
364
+ * Deprecate `ActiveRecord::Result#to_hash` in favor of `ActiveRecord::Result#to_a`.
677
365
 
678
- *Rafael Mendonça França*
366
+ *Gannon McGibbon*, *Kevin Cheng*
679
367
 
680
- * Fix `bin/rails db:setup` and `bin/rails db:test:prepare` create wrong
681
- ar_internal_metadata's data for a test database.
368
+ * SQLite3 adapter supports expression indexes.
682
369
 
683
- Before:
684
- ```
685
- $ RAILS_ENV=test rails dbconsole
686
- > SELECT * FROM ar_internal_metadata;
687
- key|value|created_at|updated_at
688
- environment|development|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
689
370
  ```
371
+ create_table :users do |t|
372
+ t.string :email
373
+ end
690
374
 
691
- After:
375
+ add_index :users, 'lower(email)', name: 'index_users_on_email', unique: true
692
376
  ```
693
- $ RAILS_ENV=test rails dbconsole
694
- > SELECT * FROM ar_internal_metadata;
695
- key|value|created_at|updated_at
696
- environment|test|2017-09-11 23:14:10.815679|2017-09-11 23:14:10.815679
697
- ```
698
-
699
- Fixes #26731.
700
-
701
- *bogdanvlviv*
702
-
703
- * Fix longer sequence name detection for serial columns.
704
-
705
- Fixes #28332.
706
377
 
707
- *Ryuta Kamizono*
708
-
709
- * MySQL: Don't lose `auto_increment: true` in the `db/schema.rb`.
378
+ *Gray Kemmey*
710
379
 
711
- Fixes #30894.
380
+ * Allow subclasses to redefine autosave callbacks for associated records.
712
381
 
713
- *Ryuta Kamizono*
382
+ Fixes #33305.
714
383
 
715
- * Fix `COUNT(DISTINCT ...)` for `GROUP BY` with `ORDER BY` and `LIMIT`.
384
+ *Andrey Subbota*
716
385
 
717
- Fixes #30886.
718
-
719
- *Ryuta Kamizono*
386
+ * Bump minimum MySQL version to 5.5.8.
720
387
 
721
- * PostgreSQL `tsrange` now preserves subsecond precision.
388
+ *Yasuo Honda*
722
389
 
723
- PostgreSQL 9.1+ introduced range types, and Rails added support for using
724
- this datatype in Active Record. However, the serialization of
725
- `PostgreSQL::OID::Range` was incomplete, because it did not properly
726
- cast the bounds that make up the range. This led to subseconds being
727
- dropped in SQL commands:
390
+ * Use MySQL utf8mb4 character set by default.
728
391
 
729
- Before:
392
+ `utf8mb4` character set with 4-Byte encoding supports supplementary characters including emoji.
393
+ The previous default 3-Byte encoding character set `utf8` is not enough to support them.
730
394
 
731
- connection.type_cast(tsrange.serialize(range_value))
732
- # => "[2010-01-01 13:30:00 UTC,2011-02-02 19:30:00 UTC)"
395
+ *Yasuo Honda*
733
396
 
734
- Now:
735
-
736
- connection.type_cast(tsrange.serialize(range_value))
737
- # => "[2010-01-01 13:30:00.670277,2011-02-02 19:30:00.745125)"
738
-
739
- *Thomas Cannon*
740
-
741
- * Passing a `Set` to `Relation#where` now behaves the same as passing an
742
- array.
743
-
744
- *Sean Griffin*
745
-
746
- * Use given algorithm while removing index from database.
747
-
748
- Fixes #24190.
749
-
750
- *Mehmet Emin İNAÇ*
751
-
752
- * Update payload names for `sql.active_record` instrumentation to be
753
- more descriptive.
397
+ * Fix duplicated record creation when using nested attributes with `create_with`.
754
398
 
755
- Fixes #30586.
399
+ *Darwin Wu*
756
400
 
757
- *Jeremy Green*
401
+ * Configuration item `config.filter_parameters` could also filter out
402
+ sensitive values of database columns when call `#inspect`.
403
+ We also added `ActiveRecord::Base::filter_attributes`/`=` in order to
404
+ specify sensitive attributes to specific model.
758
405
 
759
- * Add new error class `LockWaitTimeout` which will be raised
760
- when lock wait timeout exceeded.
406
+ ```
407
+ Rails.application.config.filter_parameters += [:credit_card_number, /phone/]
408
+ Account.last.inspect # => #<Account id: 123, name: "DHH", credit_card_number: [FILTERED], telephone_number: [FILTERED] ...>
409
+ SecureAccount.filter_attributes += [:name]
410
+ SecureAccount.last.inspect # => #<SecureAccount id: 42, name: [FILTERED], credit_card_number: [FILTERED] ...>
411
+ ```
761
412
 
762
- *Gabriel Courtemanche*
413
+ *Zhang Kang*, *Yoshiyuki Kinjo*
763
414
 
764
- * Remove deprecated `#migration_keys`.
415
+ * Deprecate `column_name_length`, `table_name_length`, `columns_per_table`,
416
+ `indexes_per_table`, `columns_per_multicolumn_index`, `sql_query_length`,
417
+ and `joins_per_query` methods in `DatabaseLimits`.
765
418
 
766
419
  *Ryuta Kamizono*
767
420
 
768
- * Automatically guess the inverse associations for STI.
769
-
770
- *Yuichiro Kaneko*
771
-
772
- * Ensure `sum` honors `distinct` on `has_many :through` associations.
773
-
774
- Fixes #16791.
775
-
776
- *Aaron Wortham*
777
-
778
- * Add `binary` fixture helper method.
779
-
780
- *Atsushi Yoshida*
781
-
782
- * When using `Relation#or`, extract the common conditions and put them before the OR condition.
421
+ * `ActiveRecord::Base.configurations` now returns an object.
783
422
 
784
- *Maxime Handfield Lapointe*
423
+ `ActiveRecord::Base.configurations` used to return a hash, but this
424
+ is an inflexible data model. In order to improve multiple-database
425
+ handling in Rails, we've changed this to return an object. Some methods
426
+ are provided to make the object behave hash-like in order to ease the
427
+ transition process. Since most applications don't manipulate the hash
428
+ we've decided to add backwards-compatible functionality that will throw
429
+ a deprecation warning if used, however calling `ActiveRecord::Base.configurations`
430
+ will use the new version internally and externally.
785
431
 
786
- * `Relation#or` now accepts two relations who have different values for
787
- `references` only, as `references` can be implicitly called by `where`.
432
+ For example, the following `database.yml`:
788
433
 
789
- Fixes #29411.
790
-
791
- *Sean Griffin*
792
-
793
- * `ApplicationRecord` is no longer generated when generating models. If you
794
- need to generate it, it can be created with `rails g application_record`.
795
-
796
- *Lisa Ugray*
797
-
798
- * Fix `COUNT(DISTINCT ...)` with `ORDER BY` and `LIMIT` to keep the existing select list.
799
-
800
- *Ryuta Kamizono*
801
-
802
- * When a `has_one` association is destroyed by `dependent: destroy`,
803
- `destroyed_by_association` will now be set to the reflection, matching the
804
- behaviour of `has_many` associations.
434
+ ```
435
+ development:
436
+ adapter: sqlite3
437
+ database: db/development.sqlite3
438
+ ```
805
439
 
806
- *Lisa Ugray*
440
+ Used to become a hash:
807
441
 
808
- * Fix `unscoped(where: [columns])` removing the wrong bind values.
442
+ ```
443
+ { "development" => { "adapter" => "sqlite3", "database" => "db/development.sqlite3" } }
444
+ ```
809
445
 
810
- When the `where` is called on a relation after a `or`, unscoping the column of that later `where` removed
811
- bind values used by the `or` instead. (possibly other cases too)
446
+ Is now converted into the following object:
812
447
 
813
448
  ```
814
- Post.where(id: 1).or(Post.where(id: 2)).where(foo: 3).unscope(where: :foo).to_sql
815
- # Currently:
816
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 2 OR "posts"."id" = 3)
817
- # With fix:
818
- # SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 1 OR "posts"."id" = 2)
449
+ #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800 @configurations=[
450
+ #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10 @env_name="development",
451
+ @spec_name="primary", @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
452
+ ]
819
453
  ```
820
454
 
821
- *Maxime Handfield Lapointe*
455
+ Iterating over the database configurations has also changed. Instead of
456
+ calling hash methods on the `configurations` hash directly, a new method `configs_for` has
457
+ been provided that allows you to select the correct configuration. `env_name`, and
458
+ `spec_name` arguments are optional. For example these return an array of
459
+ database config objects for the requested environment and a single database config object
460
+ will be returned for the requested environment and specification name respectively.
822
461
 
823
- * Values constructed using multi-parameter assignment will now use the
824
- post-type-cast value for rendering in single-field form inputs.
462
+ ```
463
+ ActiveRecord::Base.configurations.configs_for(env_name: "development")
464
+ ActiveRecord::Base.configurations.configs_for(env_name: "development", spec_name: "primary")
465
+ ```
825
466
 
826
- *Sean Griffin*
467
+ *Eileen M. Uchitelle*, *Aaron Patterson*
827
468
 
828
- * `Relation#joins` is no longer affected by the target model's
829
- `current_scope`, with the exception of `unscoped`.
469
+ * Add database configuration to disable advisory locks.
830
470
 
831
- Fixes #29338.
471
+ ```
472
+ production:
473
+ adapter: postgresql
474
+ advisory_locks: false
475
+ ```
832
476
 
833
- *Sean Griffin*
477
+ *Guo Xiang*
834
478
 
835
- * Change sqlite3 boolean serialization to use 1 and 0.
479
+ * SQLite3 adapter `alter_table` method restores foreign keys.
836
480
 
837
- SQLite natively recognizes 1 and 0 as true and false, but does not natively
838
- recognize 't' and 'f' as was previously serialized.
481
+ *Yasuo Honda*
839
482
 
840
- This change in serialization requires a migration of stored boolean data
841
- for SQLite databases, so it's implemented behind a configuration flag
842
- whose default false value is deprecated.
483
+ * Allow `:to_table` option to `invert_remove_foreign_key`.
843
484
 
844
- *Lisa Ugray*
485
+ Example:
845
486
 
846
- * Skip query caching when working with batches of records (`find_each`, `find_in_batches`,
847
- `in_batches`).
487
+ remove_foreign_key :accounts, to_table: :owners
848
488
 
849
- Previously, records would be fetched in batches, but all records would be retained in memory
850
- until the end of the request or job.
489
+ *Nikolay Epifanov*, *Rich Chen*
851
490
 
852
- *Eugene Kenny*
491
+ * Add environment & load_config dependency to `bin/rake db:seed` to enable
492
+ seed load in environments without Rails and custom DB configuration
853
493
 
854
- * Prevent errors raised by `sql.active_record` notification subscribers from being converted into
855
- `ActiveRecord::StatementInvalid` exceptions.
494
+ *Tobias Bielohlawek*
856
495
 
857
- *Dennis Taylor*
496
+ * Fix default value for mysql time types with specified precision.
858
497
 
859
- * Fix eager loading/preloading association with scope including joins.
498
+ *Nikolay Kondratyev*
860
499
 
861
- Fixes #28324.
500
+ * Fix `touch` option to behave consistently with `Persistence#touch` method.
862
501
 
863
502
  *Ryuta Kamizono*
864
503
 
865
- * Fix transactions to apply state to child transactions.
866
-
867
- Previously, if you had a nested transaction and the outer transaction was rolledback, the record from the
868
- inner transaction would still be marked as persisted.
869
-
870
- This change fixes that by applying the state of the parent transaction to the child transaction when the
871
- parent transaction is rolledback. This will correctly mark records from the inner transaction as not persisted.
872
-
873
- *Eileen M. Uchitelle*, *Aaron Patterson*
874
-
875
- * Deprecate `set_state` method in `TransactionState`.
504
+ * Migrations raise when duplicate column definition.
876
505
 
877
- Deprecated the `set_state` method in favor of setting the state via specific methods. If you need to mark the
878
- state of the transaction you can now use `rollback!`, `commit!` or `nullify!` instead of
879
- `set_state(:rolledback)`, `set_state(:committed)`, or `set_state(nil)`.
506
+ Fixes #33024.
880
507
 
881
- *Eileen M. Uchitelle*, *Aaron Patterson*
508
+ *Federico Martinez*
882
509
 
883
- * Deprecate delegating to `arel` in `Relation`.
510
+ * Bump minimum SQLite version to 3.8
884
511
 
885
- *Ryuta Kamizono*
512
+ *Yasuo Honda*
886
513
 
887
- * Query cache was unavailable when entering the `ActiveRecord::Base.cache` block
888
- without being connected.
889
-
890
- *Tsukasa Oishi*
514
+ * Fix parent record should not get saved with duplicate children records.
891
515
 
892
- * Previously, when building records using a `has_many :through` association,
893
- if the child records were deleted before the parent was saved, they would
894
- still be persisted. Now, if child records are deleted before the parent is saved
895
- on a `has_many :through` association, the child records will not be persisted.
516
+ Fixes #32940.
896
517
 
897
- *Tobias Kraze*
518
+ *Santosh Wadghule*
898
519
 
899
- * Merging two relations representing nested joins no longer transforms the joins of
900
- the merged relation into LEFT OUTER JOIN.
520
+ * Fix logic on disabling commit callbacks so they are not called unexpectedly when errors occur.
901
521
 
902
- Example:
522
+ *Brian Durand*
903
523
 
904
- ```
905
- Author.joins(:posts).merge(Post.joins(:comments))
906
- # Before the change:
907
- #=> SELECT ... FROM authors INNER JOIN posts ON ... LEFT OUTER JOIN comments ON...
524
+ * Ensure `Associations::CollectionAssociation#size` and `Associations::CollectionAssociation#empty?`
525
+ use loaded association ids if present.
908
526
 
909
- # After the change:
910
- #=> SELECT ... FROM authors INNER JOIN posts ON ... INNER JOIN comments ON...
911
- ```
527
+ *Graham Turner*
912
528
 
913
- *Maxime Handfield Lapointe*
529
+ * Add support to preload associations of polymorphic associations when not all the records have the requested associations.
914
530
 
915
- * `ActiveRecord::Persistence#touch` does not work well when optimistic locking enabled and
916
- `locking_column`, without default value, is null in the database.
531
+ *Dana Sherson*
917
532
 
918
- *bogdanvlviv*
533
+ * Add `touch_all` method to `ActiveRecord::Relation`.
919
534
 
920
- * Fix destroying existing object does not work well when optimistic locking enabled and
921
- `locking_column` is null in the database.
535
+ Example:
922
536
 
923
- *bogdanvlviv*
537
+ Person.where(name: "David").touch_all(time: Time.new(2020, 5, 16, 0, 0, 0))
924
538
 
925
- * Use bulk INSERT to insert fixtures for better performance.
539
+ *fatkodima*, *duggiefresh*
926
540
 
927
- *Kir Shatrov*
541
+ * Add `ActiveRecord::Base.base_class?` predicate.
928
542
 
929
- * Prevent creation of bind param if casted value is nil.
543
+ *Bogdan Gusiev*
930
544
 
931
- *Ryuta Kamizono*
545
+ * Add custom prefix/suffix options to `ActiveRecord::Store.store_accessor`.
932
546
 
933
- * Deprecate passing arguments and block at the same time to `count` and `sum` in `ActiveRecord::Calculations`.
547
+ *Tan Huynh*, *Yukio Mizuta*
934
548
 
935
- *Ryuta Kamizono*
549
+ * Rails 6 requires Ruby 2.5.0 or newer.
936
550
 
937
- * Loading model schema from database is now thread-safe.
551
+ *Jeremy Daer*, *Kasper Timm Hansen*
938
552
 
939
- Fixes #28589.
553
+ * Deprecate `update_attributes`/`!` in favor of `update`/`!`.
940
554
 
941
- *Vikrant Chaudhary*, *David Abdemoulaie*
555
+ *Eddie Lebow*
942
556
 
943
- * Add `ActiveRecord::Base#cache_version` to support recyclable cache keys via the new versioned entries
944
- in `ActiveSupport::Cache`. This also means that `ActiveRecord::Base#cache_key` will now return a stable key
945
- that does not include a timestamp any more.
946
-
947
- NOTE: This feature is turned off by default, and `#cache_key` will still return cache keys with timestamps
948
- until you set `ActiveRecord::Base.cache_versioning = true`. That's the setting for all new apps on Rails 5.2+
557
+ * Add `ActiveRecord::Base.create_or_find_by`/`!` to deal with the SELECT/INSERT race condition in
558
+ `ActiveRecord::Base.find_or_create_by`/`!` by leaning on unique constraints in the database.
949
559
 
950
560
  *DHH*
951
561
 
952
- * Respect `SchemaDumper.ignore_tables` in rake tasks for databases structure dump.
953
-
954
- *Rusty Geldmacher*, *Guillermo Iguaran*
955
-
956
- * Add type caster to `RuntimeReflection#alias_name`.
957
-
958
- Fixes #28959.
959
-
960
- *Jon Moss*
961
-
962
- * Deprecate `supports_statement_cache?`.
963
-
964
- *Ryuta Kamizono*
965
-
966
- * Raise error `UnknownMigrationVersionError` on the movement of migrations
967
- when the current migration does not exist.
968
-
969
- *bogdanvlviv*
562
+ * Add `Relation#pick` as short-hand for single-value plucks.
970
563
 
971
- * Fix `bin/rails db:forward` first migration.
972
-
973
- *bogdanvlviv*
974
-
975
- * Support Descending Indexes for MySQL.
976
-
977
- MySQL 8.0.1 and higher supports descending indexes: `DESC` in an index definition is no longer ignored.
978
- See https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html.
979
-
980
- *Ryuta Kamizono*
981
-
982
- * Fix inconsistency with changed attributes when overriding Active Record attribute reader.
983
-
984
- *bogdanvlviv*
985
-
986
- * When calling the dynamic fixture accessor method with no arguments, it now returns all fixtures of this type.
987
- Previously this method always returned an empty array.
988
-
989
- *Kevin McPhillips*
564
+ *DHH*
990
565
 
991
566
 
992
- Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activerecord/CHANGELOG.md) for previous changes.
567
+ Please check [5-2-stable](https://github.com/rails/rails/blob/5-2-stable/activerecord/CHANGELOG.md) for previous changes.