activerecord 7.1.5.2 → 8.1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +567 -2443
  3. data/README.rdoc +16 -16
  4. data/examples/performance.rb +2 -2
  5. data/lib/active_record/association_relation.rb +3 -2
  6. data/lib/active_record/associations/alias_tracker.rb +31 -23
  7. data/lib/active_record/associations/association.rb +43 -12
  8. data/lib/active_record/associations/belongs_to_association.rb +31 -8
  9. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +3 -2
  10. data/lib/active_record/associations/builder/association.rb +23 -11
  11. data/lib/active_record/associations/builder/belongs_to.rb +18 -4
  12. data/lib/active_record/associations/builder/collection_association.rb +7 -3
  13. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +2 -2
  14. data/lib/active_record/associations/builder/has_many.rb +3 -4
  15. data/lib/active_record/associations/builder/has_one.rb +3 -4
  16. data/lib/active_record/associations/builder/singular_association.rb +33 -5
  17. data/lib/active_record/associations/collection_association.rb +17 -9
  18. data/lib/active_record/associations/collection_proxy.rb +36 -5
  19. data/lib/active_record/associations/deprecation.rb +88 -0
  20. data/lib/active_record/associations/disable_joins_association_scope.rb +1 -1
  21. data/lib/active_record/associations/errors.rb +268 -0
  22. data/lib/active_record/associations/has_many_association.rb +1 -1
  23. data/lib/active_record/associations/has_many_through_association.rb +10 -3
  24. data/lib/active_record/associations/join_dependency/join_association.rb +1 -1
  25. data/lib/active_record/associations/join_dependency.rb +4 -2
  26. data/lib/active_record/associations/nested_error.rb +47 -0
  27. data/lib/active_record/associations/preloader/association.rb +4 -3
  28. data/lib/active_record/associations/preloader/batch.rb +7 -1
  29. data/lib/active_record/associations/preloader/branch.rb +8 -1
  30. data/lib/active_record/associations/preloader/through_association.rb +1 -3
  31. data/lib/active_record/associations/singular_association.rb +14 -3
  32. data/lib/active_record/associations/through_association.rb +1 -1
  33. data/lib/active_record/associations.rb +250 -315
  34. data/lib/active_record/asynchronous_queries_tracker.rb +28 -24
  35. data/lib/active_record/attribute_assignment.rb +0 -2
  36. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  37. data/lib/active_record/attribute_methods/primary_key.rb +25 -61
  38. data/lib/active_record/attribute_methods/query.rb +34 -0
  39. data/lib/active_record/attribute_methods/read.rb +1 -13
  40. data/lib/active_record/attribute_methods/serialization.rb +20 -27
  41. data/lib/active_record/attribute_methods/time_zone_conversion.rb +19 -20
  42. data/lib/active_record/attribute_methods.rb +71 -75
  43. data/lib/active_record/attributes.rb +96 -68
  44. data/lib/active_record/autosave_association.rb +93 -58
  45. data/lib/active_record/base.rb +5 -7
  46. data/lib/active_record/callbacks.rb +1 -1
  47. data/lib/active_record/coders/json.rb +14 -5
  48. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +50 -126
  49. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +16 -4
  50. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +52 -13
  51. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +681 -135
  52. data/lib/active_record/connection_adapters/abstract/database_statements.rb +165 -86
  53. data/lib/active_record/connection_adapters/abstract/query_cache.rb +226 -78
  54. data/lib/active_record/connection_adapters/abstract/quoting.rb +79 -114
  55. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +11 -7
  56. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +37 -36
  57. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +2 -1
  58. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +136 -34
  59. data/lib/active_record/connection_adapters/abstract/transaction.rb +163 -68
  60. data/lib/active_record/connection_adapters/abstract_adapter.rb +197 -129
  61. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +112 -63
  62. data/lib/active_record/connection_adapters/column.rb +17 -4
  63. data/lib/active_record/connection_adapters/mysql/database_statements.rb +11 -3
  64. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -57
  65. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +2 -0
  66. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +41 -10
  67. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +79 -46
  68. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +97 -101
  69. data/lib/active_record/connection_adapters/mysql2_adapter.rb +14 -33
  70. data/lib/active_record/connection_adapters/pool_config.rb +14 -13
  71. data/lib/active_record/connection_adapters/postgresql/column.rb +4 -0
  72. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +98 -44
  73. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +3 -3
  74. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +1 -1
  75. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +10 -0
  76. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +1 -1
  77. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +14 -4
  78. data/lib/active_record/connection_adapters/postgresql/quoting.rb +79 -68
  79. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -4
  80. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +9 -17
  81. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +44 -41
  82. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +69 -32
  83. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +155 -75
  84. data/lib/active_record/connection_adapters/postgresql_adapter.rb +104 -121
  85. data/lib/active_record/connection_adapters/schema_cache.rb +126 -133
  86. data/lib/active_record/connection_adapters/sqlite3/column.rb +14 -1
  87. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +91 -95
  88. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +57 -54
  89. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +16 -0
  90. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +13 -0
  91. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +43 -2
  92. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +38 -15
  93. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +231 -111
  94. data/lib/active_record/connection_adapters/statement_pool.rb +4 -2
  95. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +40 -69
  96. data/lib/active_record/connection_adapters/trilogy_adapter.rb +19 -65
  97. data/lib/active_record/connection_adapters.rb +66 -0
  98. data/lib/active_record/connection_handling.rb +88 -46
  99. data/lib/active_record/core.rb +142 -58
  100. data/lib/active_record/counter_cache.rb +52 -18
  101. data/lib/active_record/database_configurations/connection_url_resolver.rb +9 -2
  102. data/lib/active_record/database_configurations/database_config.rb +28 -5
  103. data/lib/active_record/database_configurations/hash_config.rb +103 -41
  104. data/lib/active_record/database_configurations/url_config.rb +30 -1
  105. data/lib/active_record/database_configurations.rb +8 -4
  106. data/lib/active_record/delegated_type.rb +43 -19
  107. data/lib/active_record/dynamic_matchers.rb +56 -71
  108. data/lib/active_record/encryption/config.rb +3 -1
  109. data/lib/active_record/encryption/encryptable_record.rb +12 -12
  110. data/lib/active_record/encryption/encrypted_attribute_type.rb +35 -6
  111. data/lib/active_record/encryption/encryptor.rb +58 -22
  112. data/lib/active_record/encryption/extended_deterministic_queries.rb +4 -2
  113. data/lib/active_record/encryption/key_provider.rb +1 -1
  114. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  115. data/lib/active_record/encryption/message_serializer.rb +4 -0
  116. data/lib/active_record/encryption/null_encryptor.rb +4 -0
  117. data/lib/active_record/encryption/read_only_null_encryptor.rb +4 -0
  118. data/lib/active_record/encryption/scheme.rb +9 -2
  119. data/lib/active_record/enum.rb +57 -36
  120. data/lib/active_record/errors.rb +76 -26
  121. data/lib/active_record/explain.rb +14 -25
  122. data/lib/active_record/explain_registry.rb +51 -2
  123. data/lib/active_record/filter_attribute_handler.rb +73 -0
  124. data/lib/active_record/fixture_set/table_row.rb +19 -2
  125. data/lib/active_record/fixtures.rb +39 -35
  126. data/lib/active_record/future_result.rb +21 -13
  127. data/lib/active_record/gem_version.rb +3 -3
  128. data/lib/active_record/inheritance.rb +5 -3
  129. data/lib/active_record/insert_all.rb +28 -20
  130. data/lib/active_record/integration.rb +4 -1
  131. data/lib/active_record/internal_metadata.rb +48 -34
  132. data/lib/active_record/locking/optimistic.rb +15 -7
  133. data/lib/active_record/locking/pessimistic.rb +5 -0
  134. data/lib/active_record/log_subscriber.rb +3 -34
  135. data/lib/active_record/message_pack.rb +1 -1
  136. data/lib/active_record/middleware/shard_selector.rb +34 -17
  137. data/lib/active_record/migration/command_recorder.rb +46 -14
  138. data/lib/active_record/migration/compatibility.rb +40 -25
  139. data/lib/active_record/migration/default_schema_versions_formatter.rb +30 -0
  140. data/lib/active_record/migration/default_strategy.rb +4 -5
  141. data/lib/active_record/migration/pending_migration_connection.rb +2 -2
  142. data/lib/active_record/migration.rb +119 -103
  143. data/lib/active_record/model_schema.rb +66 -78
  144. data/lib/active_record/nested_attributes.rb +17 -9
  145. data/lib/active_record/persistence.rb +161 -454
  146. data/lib/active_record/query_cache.rb +33 -15
  147. data/lib/active_record/query_logs.rb +106 -39
  148. data/lib/active_record/query_logs_formatter.rb +17 -28
  149. data/lib/active_record/querying.rb +28 -16
  150. data/lib/active_record/railtie.rb +61 -74
  151. data/lib/active_record/railties/controller_runtime.rb +19 -5
  152. data/lib/active_record/railties/databases.rake +64 -78
  153. data/lib/active_record/railties/job_checkpoints.rb +15 -0
  154. data/lib/active_record/railties/job_runtime.rb +10 -11
  155. data/lib/active_record/reflection.rb +147 -53
  156. data/lib/active_record/relation/batches/batch_enumerator.rb +19 -5
  157. data/lib/active_record/relation/batches.rb +153 -73
  158. data/lib/active_record/relation/calculations.rb +146 -96
  159. data/lib/active_record/relation/delegation.rb +30 -23
  160. data/lib/active_record/relation/finder_methods.rb +64 -34
  161. data/lib/active_record/relation/merger.rb +12 -14
  162. data/lib/active_record/relation/predicate_builder/array_handler.rb +2 -2
  163. data/lib/active_record/relation/predicate_builder/association_query_value.rb +19 -11
  164. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +8 -8
  165. data/lib/active_record/relation/predicate_builder/relation_handler.rb +4 -3
  166. data/lib/active_record/relation/predicate_builder.rb +25 -10
  167. data/lib/active_record/relation/query_attribute.rb +4 -2
  168. data/lib/active_record/relation/query_methods.rb +351 -124
  169. data/lib/active_record/relation/spawn_methods.rb +9 -25
  170. data/lib/active_record/relation/where_clause.rb +17 -30
  171. data/lib/active_record/relation.rb +590 -124
  172. data/lib/active_record/result.rb +131 -59
  173. data/lib/active_record/runtime_registry.rb +44 -21
  174. data/lib/active_record/sanitization.rb +33 -25
  175. data/lib/active_record/schema.rb +8 -6
  176. data/lib/active_record/schema_dumper.rb +66 -31
  177. data/lib/active_record/schema_migration.rb +31 -14
  178. data/lib/active_record/scoping/named.rb +6 -2
  179. data/lib/active_record/scoping.rb +0 -1
  180. data/lib/active_record/secure_token.rb +3 -3
  181. data/lib/active_record/signed_id.rb +68 -20
  182. data/lib/active_record/statement_cache.rb +29 -25
  183. data/lib/active_record/store.rb +51 -22
  184. data/lib/active_record/structured_event_subscriber.rb +85 -0
  185. data/lib/active_record/table_metadata.rb +7 -33
  186. data/lib/active_record/tasks/abstract_tasks.rb +76 -0
  187. data/lib/active_record/tasks/database_tasks.rb +118 -90
  188. data/lib/active_record/tasks/mysql_database_tasks.rb +3 -42
  189. data/lib/active_record/tasks/postgresql_database_tasks.rb +14 -40
  190. data/lib/active_record/tasks/sqlite_database_tasks.rb +17 -28
  191. data/lib/active_record/test_databases.rb +14 -4
  192. data/lib/active_record/test_fixtures.rb +123 -89
  193. data/lib/active_record/testing/query_assertions.rb +127 -0
  194. data/lib/active_record/timestamp.rb +6 -4
  195. data/lib/active_record/token_for.rb +22 -12
  196. data/lib/active_record/touch_later.rb +1 -1
  197. data/lib/active_record/transaction.rb +129 -0
  198. data/lib/active_record/transactions.rb +97 -18
  199. data/lib/active_record/translation.rb +0 -2
  200. data/lib/active_record/type/hash_lookup_type_map.rb +2 -1
  201. data/lib/active_record/type/internal/timezone.rb +7 -0
  202. data/lib/active_record/type/json.rb +15 -2
  203. data/lib/active_record/type/serialized.rb +12 -7
  204. data/lib/active_record/type/type_map.rb +1 -1
  205. data/lib/active_record/type_caster/connection.rb +5 -4
  206. data/lib/active_record/validations/associated.rb +10 -4
  207. data/lib/active_record/validations/uniqueness.rb +23 -18
  208. data/lib/active_record/validations.rb +4 -1
  209. data/lib/active_record.rb +203 -59
  210. data/lib/arel/alias_predication.rb +3 -1
  211. data/lib/arel/collectors/bind.rb +4 -2
  212. data/lib/arel/collectors/composite.rb +7 -0
  213. data/lib/arel/collectors/sql_string.rb +2 -2
  214. data/lib/arel/collectors/substitute_binds.rb +3 -3
  215. data/lib/arel/crud.rb +8 -11
  216. data/lib/arel/delete_manager.rb +5 -0
  217. data/lib/arel/nodes/binary.rb +1 -7
  218. data/lib/arel/nodes/bound_sql_literal.rb +9 -5
  219. data/lib/arel/nodes/count.rb +2 -2
  220. data/lib/arel/nodes/delete_statement.rb +4 -2
  221. data/lib/arel/nodes/function.rb +4 -10
  222. data/lib/arel/nodes/named_function.rb +2 -2
  223. data/lib/arel/nodes/{and.rb → nary.rb} +5 -2
  224. data/lib/arel/nodes/node.rb +6 -5
  225. data/lib/arel/nodes/sql_literal.rb +8 -1
  226. data/lib/arel/nodes/update_statement.rb +4 -2
  227. data/lib/arel/nodes.rb +2 -4
  228. data/lib/arel/predications.rb +1 -1
  229. data/lib/arel/select_manager.rb +14 -5
  230. data/lib/arel/table.rb +3 -7
  231. data/lib/arel/tree_manager.rb +3 -2
  232. data/lib/arel/update_manager.rb +7 -1
  233. data/lib/arel/visitors/dot.rb +3 -3
  234. data/lib/arel/visitors/mysql.rb +9 -4
  235. data/lib/arel/visitors/postgresql.rb +56 -12
  236. data/lib/arel/visitors/sqlite.rb +80 -8
  237. data/lib/arel/visitors/to_sql.rb +34 -37
  238. data/lib/arel.rb +10 -4
  239. data/lib/rails/generators/active_record/application_record/USAGE +1 -1
  240. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +4 -1
  241. metadata +23 -14
  242. data/lib/active_record/explain_subscriber.rb +0 -34
  243. data/lib/active_record/normalization.rb +0 -167
  244. data/lib/active_record/relation/record_fetch_warning.rb +0 -49
@@ -22,10 +22,12 @@ module ActiveRecord
22
22
  # * change_table_comment (must supply a +:from+ and +:to+ option)
23
23
  # * create_enum
24
24
  # * create_join_table
25
+ # * create_virtual_table
25
26
  # * create_table
26
27
  # * disable_extension
27
28
  # * drop_enum (must supply a list of values)
28
29
  # * drop_join_table
30
+ # * drop_virtual_table (must supply options)
29
31
  # * drop_table (must supply a block)
30
32
  # * enable_extension
31
33
  # * remove_column (must supply a type)
@@ -38,10 +40,12 @@ module ActiveRecord
38
40
  # * remove_reference
39
41
  # * remove_timestamps
40
42
  # * rename_column
41
- # * rename_enum (must supply a +:to+ option)
43
+ # * rename_enum
42
44
  # * rename_enum_value (must supply a +:from+ and +:to+ option)
43
45
  # * rename_index
44
46
  # * rename_table
47
+ # * enable_index
48
+ # * disable_index
45
49
  class CommandRecorder
46
50
  ReversibleAndIrreversibleMethods = [
47
51
  :create_table, :create_join_table, :rename_table, :add_column, :remove_column,
@@ -55,6 +59,9 @@ module ActiveRecord
55
59
  :add_exclusion_constraint, :remove_exclusion_constraint,
56
60
  :add_unique_constraint, :remove_unique_constraint,
57
61
  :create_enum, :drop_enum, :rename_enum, :add_enum_value, :rename_enum_value,
62
+ :create_schema, :drop_schema,
63
+ :create_virtual_table, :drop_virtual_table,
64
+ :enable_index, :disable_index
58
65
  ]
59
66
  include JoinTable
60
67
 
@@ -163,7 +170,9 @@ module ActiveRecord
163
170
  add_exclusion_constraint: :remove_exclusion_constraint,
164
171
  add_unique_constraint: :remove_unique_constraint,
165
172
  enable_extension: :disable_extension,
166
- create_enum: :drop_enum
173
+ create_enum: :drop_enum,
174
+ create_schema: :drop_schema,
175
+ create_virtual_table: :drop_virtual_table
167
176
  }.each do |cmd, inv|
168
177
  [[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
169
178
  class_eval <<-EOV, __FILE__, __LINE__ + 1
@@ -177,6 +186,16 @@ module ActiveRecord
177
186
 
178
187
  include StraightReversions
179
188
 
189
+ def invert_enable_index(args)
190
+ table_name, index_name = args
191
+ [:disable_index, [table_name, index_name]]
192
+ end
193
+
194
+ def invert_disable_index(args)
195
+ table_name, index_name = args
196
+ [:enable_index, [table_name, index_name]]
197
+ end
198
+
180
199
  def invert_transaction(args, &block)
181
200
  sub_recorder = CommandRecorder.new(delegate)
182
201
  sub_recorder.revert(&block)
@@ -196,13 +215,20 @@ module ActiveRecord
196
215
  end
197
216
 
198
217
  def invert_drop_table(args, &block)
199
- if args.last.is_a?(Hash)
200
- args.last.delete(:if_exists)
218
+ options = args.extract_options!
219
+ options.delete(:if_exists)
220
+
221
+ if args.size > 1
222
+ raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given a single table name."
201
223
  end
202
- if args.size == 1 && block == nil
224
+
225
+ if args.size == 1 && options == {} && block == nil
203
226
  raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
204
227
  end
205
- super
228
+
229
+ args << options unless options.empty?
230
+
231
+ super(args, &block)
206
232
  end
207
233
 
208
234
  def invert_rename_table(args)
@@ -353,13 +379,13 @@ module ActiveRecord
353
379
  end
354
380
 
355
381
  def invert_rename_enum(args)
356
- name, options = args
382
+ name, new_name, = args
357
383
 
358
- unless options.is_a?(Hash) && options.has_key?(:to)
359
- raise ActiveRecord::IrreversibleMigration, "rename_enum is only reversible if given a :to option."
384
+ if new_name.is_a?(Hash) && new_name.key?(:to)
385
+ new_name = new_name[:to]
360
386
  end
361
387
 
362
- [:rename_enum, [options[:to], to: name]]
388
+ [:rename_enum, [new_name, name]]
363
389
  end
364
390
 
365
391
  def invert_rename_enum_value(args)
@@ -369,7 +395,14 @@ module ActiveRecord
369
395
  raise ActiveRecord::IrreversibleMigration, "rename_enum_value is only reversible if given a :from and :to option."
370
396
  end
371
397
 
372
- [:rename_enum_value, [type_name, from: options[:to], to: options[:from]]]
398
+ options[:to], options[:from] = options[:from], options[:to]
399
+ [:rename_enum_value, [type_name, options]]
400
+ end
401
+
402
+ def invert_drop_virtual_table(args)
403
+ _enum, values = args.dup.tap(&:extract_options!)
404
+ raise ActiveRecord::IrreversibleMigration, "drop_virtual_table is only reversible if given options." unless values
405
+ super
373
406
  end
374
407
 
375
408
  def respond_to_missing?(method, _)
@@ -377,14 +410,13 @@ module ActiveRecord
377
410
  end
378
411
 
379
412
  # Forwards any missing method call to the \target.
380
- def method_missing(method, *args, &block)
413
+ def method_missing(method, ...)
381
414
  if delegate.respond_to?(method)
382
- delegate.public_send(method, *args, &block)
415
+ delegate.public_send(method, ...)
383
416
  else
384
417
  super
385
418
  end
386
419
  end
387
- ruby2_keywords(:method_missing)
388
420
  end
389
421
  end
390
422
  end
@@ -21,8 +21,7 @@ module ActiveRecord
21
21
  # New migration functionality that will never be backward compatible should be added directly to `ActiveRecord::Migration`.
22
22
  #
23
23
  # There are classes for each prior Rails version. Each class descends from the *next* Rails version, so:
24
- # 7.0 < 7.1
25
- # 5.2 < 6.0 < 6.1 < 7.0 < 7.1
24
+ # 5.2 < 6.0 < 6.1 < 7.0 < 7.1 < 7.2 < 8.0 < 8.1
26
25
  #
27
26
  # If you are introducing new migration functionality that should only apply from Rails 7 onward, then you should
28
27
  # find the class that immediately precedes it (6.1), and override the relevant migration methods to undo your changes.
@@ -30,7 +29,37 @@ module ActiveRecord
30
29
  # For example, Rails 6 added a default value for the `precision` option on datetime columns. So in this file, the `V5_2`
31
30
  # class sets the value of `precision` to `nil` if it's not explicitly provided. This way, the default value will not apply
32
31
  # for migrations written for 5.2, but will for migrations written for 6.0.
33
- V7_1 = Current
32
+ V8_1 = Current
33
+
34
+ class V8_0 < V8_1
35
+ module RemoveForeignKeyColumnMatch
36
+ def remove_foreign_key(*args, **options)
37
+ options[:_skip_column_match] = true
38
+ super
39
+ end
40
+ end
41
+
42
+ module TableDefinition
43
+ def remove_foreign_key(to_table = nil, **options)
44
+ options[:_skip_column_match] = true
45
+ super
46
+ end
47
+ end
48
+
49
+ include RemoveForeignKeyColumnMatch
50
+
51
+ private
52
+ def compatible_table_definition(t)
53
+ t.singleton_class.prepend(TableDefinition)
54
+ super
55
+ end
56
+ end
57
+
58
+ class V7_2 < V8_0
59
+ end
60
+
61
+ class V7_1 < V7_2
62
+ end
34
63
 
35
64
  class V7_0 < V7_1
36
65
  module LegacyIndexName
@@ -149,9 +178,7 @@ module ActiveRecord
149
178
 
150
179
  private
151
180
  def compatible_table_definition(t)
152
- class << t
153
- prepend TableDefinition
154
- end
181
+ t.singleton_class.prepend(TableDefinition)
155
182
  super
156
183
  end
157
184
  end
@@ -212,9 +239,7 @@ module ActiveRecord
212
239
 
213
240
  private
214
241
  def compatible_table_definition(t)
215
- class << t
216
- prepend TableDefinition
217
- end
242
+ t.singleton_class.prepend(TableDefinition)
218
243
  super
219
244
  end
220
245
  end
@@ -255,9 +280,7 @@ module ActiveRecord
255
280
 
256
281
  private
257
282
  def compatible_table_definition(t)
258
- class << t
259
- prepend TableDefinition
260
- end
283
+ t.singleton_class.prepend(TableDefinition)
261
284
  super
262
285
  end
263
286
  end
@@ -303,17 +326,13 @@ module ActiveRecord
303
326
 
304
327
  private
305
328
  def compatible_table_definition(t)
306
- class << t
307
- prepend TableDefinition
308
- end
329
+ t.singleton_class.prepend(TableDefinition)
309
330
  super
310
331
  end
311
332
 
312
333
  def command_recorder
313
334
  recorder = super
314
- class << recorder
315
- prepend CommandRecorder
316
- end
335
+ recorder.singleton_class.prepend(CommandRecorder)
317
336
  recorder
318
337
  end
319
338
  end
@@ -401,9 +420,7 @@ module ActiveRecord
401
420
 
402
421
  private
403
422
  def compatible_table_definition(t)
404
- class << t
405
- prepend TableDefinition
406
- end
423
+ t.singleton_class.prepend(TableDefinition)
407
424
  super
408
425
  end
409
426
  end
@@ -437,7 +454,7 @@ module ActiveRecord
437
454
  super
438
455
  end
439
456
 
440
- def index_exists?(table_name, column_name, **options)
457
+ def index_exists?(table_name, column_name = nil, **options)
441
458
  column_names = Array(column_name).map(&:to_s)
442
459
  options[:name] =
443
460
  if options[:name].present?
@@ -455,9 +472,7 @@ module ActiveRecord
455
472
 
456
473
  private
457
474
  def compatible_table_definition(t)
458
- class << t
459
- prepend TableDefinition
460
- end
475
+ t.singleton_class.prepend(TableDefinition)
461
476
  super
462
477
  end
463
478
 
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ # This class is used by the schema dumper to format versions information.
6
+ #
7
+ # The class receives the current +connection+ when initialized.
8
+ class DefaultSchemaVersionsFormatter # :nodoc:
9
+ def initialize(connection)
10
+ @connection = connection
11
+ end
12
+
13
+ def format(versions)
14
+ sm_table = connection.quote_table_name(connection.pool.schema_migration.table_name)
15
+
16
+ if versions.is_a?(Array)
17
+ sql = +"INSERT INTO #{sm_table} (version) VALUES\n"
18
+ sql << versions.reverse.map { |v| "(#{connection.quote(v)})" }.join(",\n")
19
+ sql << ";"
20
+ sql
21
+ else
22
+ "INSERT INTO #{sm_table} (version) VALUES (#{connection.quote(versions)});"
23
+ end
24
+ end
25
+
26
+ private
27
+ attr_reader :connection
28
+ end
29
+ end
30
+ end
@@ -6,13 +6,12 @@ module ActiveRecord
6
6
  # to the connection adapter.
7
7
  class DefaultStrategy < ExecutionStrategy # :nodoc:
8
8
  private
9
- def method_missing(method, *arguments, &block)
10
- connection.send(method, *arguments, &block)
9
+ def method_missing(method, ...)
10
+ connection.send(method, ...)
11
11
  end
12
- ruby2_keywords(:method_missing)
13
12
 
14
- def respond_to_missing?(method, *)
15
- connection.respond_to?(method) || super
13
+ def respond_to_missing?(method, include_private = false)
14
+ connection.respond_to?(method, include_private) || super
16
15
  end
17
16
 
18
17
  def connection
@@ -2,10 +2,10 @@
2
2
 
3
3
  module ActiveRecord
4
4
  class PendingMigrationConnection # :nodoc:
5
- def self.establish_temporary_connection(db_config, &block)
5
+ def self.with_temporary_pool(db_config, &block)
6
6
  pool = ActiveRecord::Base.connection_handler.establish_connection(db_config, owner_name: self)
7
7
 
8
- yield pool.connection
8
+ yield pool
9
9
  ensure
10
10
  ActiveRecord::Base.connection_handler.remove_connection_pool(self.name)
11
11
  end