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