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