activerecord 6.0.2.2 → 6.0.3.rc1

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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.rdoc +1 -1
  4. data/lib/active_record.rb +1 -0
  5. data/lib/active_record/advisory_lock_base.rb +18 -0
  6. data/lib/active_record/aggregations.rb +0 -1
  7. data/lib/active_record/association_relation.rb +4 -11
  8. data/lib/active_record/associations.rb +1 -1
  9. data/lib/active_record/associations/alias_tracker.rb +0 -1
  10. data/lib/active_record/associations/association.rb +5 -9
  11. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +0 -2
  12. data/lib/active_record/associations/collection_proxy.rb +1 -2
  13. data/lib/active_record/associations/has_many_association.rb +0 -1
  14. data/lib/active_record/associations/join_dependency.rb +9 -0
  15. data/lib/active_record/associations/preloader.rb +0 -1
  16. data/lib/active_record/attribute_assignment.rb +0 -1
  17. data/lib/active_record/attribute_decorators.rb +0 -2
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +0 -1
  19. data/lib/active_record/attribute_methods/dirty.rb +2 -2
  20. data/lib/active_record/attribute_methods/primary_key.rb +0 -2
  21. data/lib/active_record/attribute_methods/read.rb +0 -1
  22. data/lib/active_record/attribute_methods/serialization.rb +0 -1
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +0 -2
  24. data/lib/active_record/attribute_methods/write.rb +0 -1
  25. data/lib/active_record/attributes.rb +0 -1
  26. data/lib/active_record/autosave_association.rb +3 -3
  27. data/lib/active_record/callbacks.rb +1 -2
  28. data/lib/active_record/coders/yaml_column.rb +0 -1
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +0 -3
  30. data/lib/active_record/connection_adapters/abstract/database_statements.rb +17 -15
  31. data/lib/active_record/connection_adapters/abstract/query_cache.rb +0 -1
  32. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +1 -2
  33. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +27 -27
  34. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +47 -30
  35. data/lib/active_record/connection_adapters/abstract/transaction.rb +4 -5
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +7 -3
  37. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +12 -28
  38. data/lib/active_record/connection_adapters/connection_specification.rb +1 -2
  39. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  40. data/lib/active_record/connection_adapters/mysql/database_statements.rb +5 -11
  41. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +0 -1
  42. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +1 -2
  43. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +8 -8
  44. data/lib/active_record/connection_adapters/mysql2_adapter.rb +0 -1
  45. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +6 -2
  46. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
  47. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  48. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
  49. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +0 -1
  50. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  51. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +0 -1
  52. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +0 -1
  53. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  54. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +0 -1
  55. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  56. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -2
  57. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
  58. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  59. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +15 -29
  60. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  61. data/lib/active_record/connection_adapters/postgresql_adapter.rb +5 -2
  62. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +5 -6
  63. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +0 -1
  64. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +8 -7
  66. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  67. data/lib/active_record/connection_handling.rb +10 -26
  68. data/lib/active_record/core.rb +0 -2
  69. data/lib/active_record/counter_cache.rb +4 -1
  70. data/lib/active_record/database_configurations/url_config.rb +0 -1
  71. data/lib/active_record/dynamic_matchers.rb +2 -3
  72. data/lib/active_record/explain.rb +0 -1
  73. data/lib/active_record/fixture_set/table_row.rb +0 -1
  74. data/lib/active_record/fixture_set/table_rows.rb +0 -1
  75. data/lib/active_record/fixtures.rb +0 -3
  76. data/lib/active_record/gem_version.rb +2 -2
  77. data/lib/active_record/inheritance.rb +0 -3
  78. data/lib/active_record/insert_all.rb +3 -3
  79. data/lib/active_record/internal_metadata.rb +1 -1
  80. data/lib/active_record/locking/optimistic.rb +0 -1
  81. data/lib/active_record/log_subscriber.rb +1 -1
  82. data/lib/active_record/middleware/database_selector.rb +0 -1
  83. data/lib/active_record/middleware/database_selector/resolver.rb +1 -2
  84. data/lib/active_record/migration.rb +4 -4
  85. data/lib/active_record/migration/command_recorder.rb +6 -18
  86. data/lib/active_record/migration/compatibility.rb +3 -3
  87. data/lib/active_record/migration/join_table.rb +0 -1
  88. data/lib/active_record/model_schema.rb +0 -2
  89. data/lib/active_record/nested_attributes.rb +0 -2
  90. data/lib/active_record/no_touching.rb +2 -2
  91. data/lib/active_record/null_relation.rb +0 -1
  92. data/lib/active_record/persistence.rb +4 -5
  93. data/lib/active_record/querying.rb +1 -1
  94. data/lib/active_record/railtie.rb +1 -1
  95. data/lib/active_record/railties/collection_cache_association_loading.rb +1 -1
  96. data/lib/active_record/reflection.rb +8 -8
  97. data/lib/active_record/relation.rb +12 -1
  98. data/lib/active_record/relation/batches.rb +0 -1
  99. data/lib/active_record/relation/calculations.rb +1 -1
  100. data/lib/active_record/relation/delegation.rb +7 -6
  101. data/lib/active_record/relation/finder_methods.rb +0 -1
  102. data/lib/active_record/relation/from_clause.rb +4 -0
  103. data/lib/active_record/relation/merger.rb +0 -1
  104. data/lib/active_record/relation/predicate_builder.rb +1 -5
  105. data/lib/active_record/relation/query_methods.rb +9 -7
  106. data/lib/active_record/relation/spawn_methods.rb +0 -1
  107. data/lib/active_record/relation/where_clause.rb +0 -1
  108. data/lib/active_record/result.rb +0 -1
  109. data/lib/active_record/schema_migration.rb +1 -1
  110. data/lib/active_record/scoping.rb +0 -1
  111. data/lib/active_record/scoping/default.rb +0 -1
  112. data/lib/active_record/scoping/named.rb +3 -4
  113. data/lib/active_record/store.rb +1 -1
  114. data/lib/active_record/suppressor.rb +2 -2
  115. data/lib/active_record/table_metadata.rb +16 -1
  116. data/lib/active_record/tasks/mysql_database_tasks.rb +0 -1
  117. data/lib/active_record/tasks/postgresql_database_tasks.rb +0 -1
  118. data/lib/active_record/tasks/sqlite_database_tasks.rb +0 -1
  119. data/lib/active_record/test_fixtures.rb +1 -1
  120. data/lib/active_record/timestamp.rb +0 -1
  121. data/lib/active_record/touch_later.rb +1 -2
  122. data/lib/active_record/transactions.rb +8 -8
  123. data/lib/active_record/type.rb +0 -1
  124. data/lib/active_record/type/adapter_specific_registry.rb +2 -5
  125. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  126. data/lib/active_record/type/serialized.rb +0 -1
  127. data/lib/active_record/type/type_map.rb +0 -1
  128. data/lib/active_record/type/unsigned_integer.rb +0 -1
  129. data/lib/active_record/validations.rb +2 -3
  130. data/lib/active_record/validations/associated.rb +1 -2
  131. data/lib/arel.rb +5 -1
  132. data/lib/arel/predications.rb +5 -6
  133. data/lib/arel/visitors/depth_first.rb +0 -1
  134. data/lib/arel/visitors/dot.rb +0 -1
  135. data/lib/arel/visitors/mssql.rb +0 -1
  136. data/lib/arel/visitors/oracle.rb +1 -2
  137. data/lib/arel/visitors/oracle12.rb +0 -1
  138. data/lib/arel/visitors/postgresql.rb +0 -1
  139. data/lib/arel/visitors/sqlite.rb +0 -1
  140. data/lib/arel/visitors/to_sql.rb +0 -1
  141. data/lib/arel/visitors/visitor.rb +0 -1
  142. data/lib/arel/visitors/where_sql.rb +0 -1
  143. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  144. data/lib/rails/generators/active_record/migration.rb +0 -1
  145. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +1 -1
  146. data/lib/rails/generators/active_record/model/model_generator.rb +0 -1
  147. metadata +14 -13
@@ -258,7 +258,6 @@ module ActiveRecord
258
258
  end
259
259
 
260
260
  private
261
-
262
261
  def apply_limits(relation, start, finish)
263
262
  relation = apply_start_limit(relation, start) if start
264
263
  relation = apply_finish_limit(relation, finish) if finish
@@ -172,7 +172,7 @@ module ActiveRecord
172
172
  # # SELECT people.id FROM people WHERE people.age = 21 LIMIT 5
173
173
  # # => [2, 3]
174
174
  #
175
- # Person.pluck('DATEDIFF(updated_at, created_at)')
175
+ # Person.pluck(Arel.sql('DATEDIFF(updated_at, created_at)'))
176
176
  # # SELECT DATEDIFF(updated_at, created_at) FROM people
177
177
  # # => ['0', '27761', '173']
178
178
  #
@@ -60,15 +60,17 @@ module ActiveRecord
60
60
  return if method_defined?(method)
61
61
 
62
62
  if /\A[a-zA-Z_]\w*[!?]?\z/.match?(method)
63
+ definition = RUBY_VERSION >= "2.7" ? "..." : "*args, &block"
63
64
  module_eval <<-RUBY, __FILE__, __LINE__ + 1
64
- def #{method}(*args, &block)
65
- scoping { klass.#{method}(*args, &block) }
65
+ def #{method}(#{definition})
66
+ scoping { klass.#{method}(#{definition}) }
66
67
  end
67
68
  RUBY
68
69
  else
69
70
  define_method(method) do |*args, &block|
70
71
  scoping { klass.public_send(method, *args, &block) }
71
72
  end
73
+ ruby2_keywords(method) if respond_to?(:ruby2_keywords, true)
72
74
  end
73
75
  end
74
76
  end
@@ -99,7 +101,6 @@ module ActiveRecord
99
101
  end
100
102
 
101
103
  private
102
-
103
104
  def method_missing(method, *args, &block)
104
105
  if @klass.respond_to?(method)
105
106
  @klass.generate_relation_method(method)
@@ -108,15 +109,15 @@ module ActiveRecord
108
109
  super
109
110
  end
110
111
  end
112
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
111
113
  end
112
114
 
113
115
  module ClassMethods # :nodoc:
114
- def create(klass, *args)
115
- relation_class_for(klass).new(klass, *args)
116
+ def create(klass, *args, **kwargs)
117
+ relation_class_for(klass).new(klass, *args, **kwargs)
116
118
  end
117
119
 
118
120
  private
119
-
120
121
  def relation_class_for(klass)
121
122
  klass.relation_delegate_class(self)
122
123
  end
@@ -346,7 +346,6 @@ module ActiveRecord
346
346
  end
347
347
 
348
348
  private
349
-
350
349
  def offset_index
351
350
  offset_value || 0
352
351
  end
@@ -18,6 +18,10 @@ module ActiveRecord
18
18
  value.nil?
19
19
  end
20
20
 
21
+ def ==(other)
22
+ self.class == other.class && value == other.value && name == other.name
23
+ end
24
+
21
25
  def self.empty
22
26
  @empty ||= new(nil, nil)
23
27
  end
@@ -89,7 +89,6 @@ module ActiveRecord
89
89
  end
90
90
 
91
91
  private
92
-
93
92
  def merge_preloads
94
93
  return if other.preload_values.empty? && other.includes_values.empty?
95
94
 
@@ -67,7 +67,7 @@ module ActiveRecord
67
67
 
68
68
  attributes.flat_map do |key, value|
69
69
  if value.is_a?(Hash) && !table.has_column?(key)
70
- associated_predicate_builder(key).expand_from_hash(value)
70
+ table.associated_predicate_builder(key).expand_from_hash(value)
71
71
  elsif table.associated_with?(key)
72
72
  # Find the foreign key when using queries such as:
73
73
  # Post.where(author: author)
@@ -114,10 +114,6 @@ module ActiveRecord
114
114
  private
115
115
  attr_reader :table
116
116
 
117
- def associated_predicate_builder(association_name)
118
- self.class.new(table.associated_table(association_name))
119
- end
120
-
121
117
  def convert_dot_notation_to_hash(attributes)
122
118
  dot_notation = attributes.select do |k, v|
123
119
  k.include?(".") && !v.is_a?(Hash)
@@ -51,7 +51,7 @@ module ActiveRecord
51
51
  if not_behaves_as_nor?(opts)
52
52
  ActiveSupport::Deprecation.warn(<<~MSG.squish)
53
53
  NOT conditions will no longer behave as NOR in Rails 6.1.
54
- To continue using NOR conditions, NOT each conditions manually
54
+ To continue using NOR conditions, NOT each condition individually
55
55
  (`#{
56
56
  opts.flat_map { |key, value|
57
57
  if value.is_a?(Hash) && value.size > 1
@@ -168,7 +168,7 @@ module ActiveRecord
168
168
  end
169
169
 
170
170
  def eager_load!(*args) # :nodoc:
171
- self.eager_load_values += args
171
+ self.eager_load_values |= args
172
172
  self
173
173
  end
174
174
 
@@ -182,7 +182,7 @@ module ActiveRecord
182
182
  end
183
183
 
184
184
  def preload!(*args) # :nodoc:
185
- self.preload_values += args
185
+ self.preload_values |= args
186
186
  self
187
187
  end
188
188
 
@@ -331,7 +331,7 @@ module ActiveRecord
331
331
  def group!(*args) # :nodoc:
332
332
  args.flatten!
333
333
 
334
- self.group_values += args
334
+ self.group_values |= args
335
335
  self
336
336
  end
337
337
 
@@ -499,7 +499,7 @@ module ActiveRecord
499
499
  def joins!(*args) # :nodoc:
500
500
  args.compact!
501
501
  args.flatten!
502
- self.joins_values += args
502
+ self.joins_values |= args
503
503
  self
504
504
  end
505
505
 
@@ -517,7 +517,7 @@ module ActiveRecord
517
517
  def left_outer_joins!(*args) # :nodoc:
518
518
  args.compact!
519
519
  args.flatten!
520
- self.left_outer_joins_values += args
520
+ self.left_outer_joins_values |= args
521
521
  self
522
522
  end
523
523
 
@@ -1221,7 +1221,9 @@ module ActiveRecord
1221
1221
  end
1222
1222
 
1223
1223
  def table_name_matches?(from)
1224
- /(?:\A|(?<!FROM)\s)(?:\b#{table.name}\b|#{connection.quote_table_name(table.name)})(?!\.)/i.match?(from.to_s)
1224
+ table_name = Regexp.escape(table.name)
1225
+ quoted_table_name = Regexp.escape(connection.quote_table_name(table.name))
1226
+ /(?:\A|(?<!FROM)\s)(?:\b#{table_name}\b|#{quoted_table_name})(?!\.)/i.match?(from.to_s)
1225
1227
  end
1226
1228
 
1227
1229
  def reverse_sql_order(order_query)
@@ -67,7 +67,6 @@ module ActiveRecord
67
67
  end
68
68
 
69
69
  private
70
-
71
70
  def relation_with(values)
72
71
  result = Relation.create(klass, values: values)
73
72
  result.extend(*extending_values) if extending_values.any?
@@ -87,7 +87,6 @@ module ActiveRecord
87
87
  end
88
88
 
89
89
  protected
90
-
91
90
  attr_reader :predicates
92
91
 
93
92
  def referenced_columns
@@ -132,7 +132,6 @@ module ActiveRecord
132
132
  end
133
133
 
134
134
  private
135
-
136
135
  def column_type(name, type_overrides = {})
137
136
  type_overrides.fetch(name) do
138
137
  column_types.fetch(name, Type.default_value)
@@ -31,7 +31,7 @@ module ActiveRecord
31
31
  version_options = connection.internal_string_options_for_primary_key
32
32
 
33
33
  connection.create_table(table_name, id: false) do |t|
34
- t.string :version, version_options
34
+ t.string :version, **version_options
35
35
  end
36
36
  end
37
37
  end
@@ -95,7 +95,6 @@ module ActiveRecord
95
95
  end
96
96
 
97
97
  private
98
-
99
98
  def raise_invalid_scope_type!(scope_type)
100
99
  if !VALID_SCOPE_TYPES.include?(scope_type)
101
100
  raise ArgumentError, "Invalid scope type '#{scope_type}' sent to the registry. Scope types must be included in VALID_SCOPE_TYPES"
@@ -44,7 +44,6 @@ module ActiveRecord
44
44
  end
45
45
 
46
46
  private
47
-
48
47
  # Use this macro in your model to set a default scope for all operations on
49
48
  # the model.
50
49
  #
@@ -31,8 +31,7 @@ module ActiveRecord
31
31
  ActiveSupport::Deprecation.warn(<<~MSG.squish)
32
32
  Class level methods will no longer inherit scoping from `#{scope._deprecated_scope_source}`
33
33
  in Rails 6.1. To continue using the scoped relation, pass it into the block directly.
34
- To instead access the full set of models, as Rails 6.1 will, use `#{name}.unscoped`,
35
- or `#{name}.default_scoped` if a model has default scopes.
34
+ To instead access the full set of models, as Rails 6.1 will, use `#{name}.default_scoped`.
36
35
  MSG
37
36
  end
38
37
 
@@ -54,7 +53,8 @@ module ActiveRecord
54
53
  end
55
54
  end
56
55
 
57
- def default_scoped(scope = relation) # :nodoc:
56
+ # Returns a scope for the model with default scopes.
57
+ def default_scoped(scope = relation)
58
58
  build_default_scope(scope) || scope
59
59
  end
60
60
 
@@ -205,7 +205,6 @@ module ActiveRecord
205
205
  end
206
206
 
207
207
  private
208
-
209
208
  def valid_scope_name?(name)
210
209
  if respond_to?(name, true) && logger
211
210
  logger.warn "Creating scope :#{name}. " \
@@ -103,7 +103,7 @@ module ActiveRecord
103
103
  module ClassMethods
104
104
  def store(store_attribute, options = {})
105
105
  serialize store_attribute, IndifferentCoder.new(store_attribute, options[:coder])
106
- store_accessor(store_attribute, options[:accessors], options.slice(:prefix, :suffix)) if options.has_key? :accessors
106
+ store_accessor(store_attribute, options[:accessors], **options.slice(:prefix, :suffix)) if options.has_key? :accessors
107
107
  end
108
108
 
109
109
  def store_accessor(store_attribute, *keys, prefix: nil, suffix: nil)
@@ -40,11 +40,11 @@ module ActiveRecord
40
40
  end
41
41
  end
42
42
 
43
- def save(*) # :nodoc:
43
+ def save(*, **) # :nodoc:
44
44
  SuppressorRegistry.suppressed[self.class.name] ? true : super
45
45
  end
46
46
 
47
- def save!(*) # :nodoc:
47
+ def save!(*, **) # :nodoc:
48
48
  SuppressorRegistry.suppressed[self.class.name] ? true : super
49
49
  end
50
50
  end
@@ -45,7 +45,7 @@ module ActiveRecord
45
45
  association = klass._reflect_on_association(table_name) || klass._reflect_on_association(table_name.to_s.singularize)
46
46
 
47
47
  if !association && table_name == arel_table.name
48
- return self
48
+ self
49
49
  elsif association && !association.polymorphic?
50
50
  association_klass = association.klass
51
51
  arel_table = association_klass.arel_table.alias(table_name)
@@ -57,6 +57,10 @@ module ActiveRecord
57
57
  end
58
58
  end
59
59
 
60
+ def associated_predicate_builder(table_name)
61
+ associated_table(table_name).predicate_builder
62
+ end
63
+
60
64
  def polymorphic_association?
61
65
  association && association.polymorphic?
62
66
  end
@@ -69,6 +73,17 @@ module ActiveRecord
69
73
  klass.reflect_on_aggregation(aggregation_name)
70
74
  end
71
75
 
76
+ protected
77
+ def predicate_builder
78
+ if klass
79
+ predicate_builder = klass.predicate_builder.dup
80
+ predicate_builder.instance_variable_set(:@table, self)
81
+ predicate_builder
82
+ else
83
+ PredicateBuilder.new(self)
84
+ end
85
+ end
86
+
72
87
  private
73
88
  attr_reader :klass, :types, :arel_table, :association
74
89
  end
@@ -69,7 +69,6 @@ module ActiveRecord
69
69
  end
70
70
 
71
71
  private
72
-
73
72
  attr_reader :configuration
74
73
 
75
74
  def configuration_without_database
@@ -89,7 +89,6 @@ module ActiveRecord
89
89
  end
90
90
 
91
91
  private
92
-
93
92
  attr_reader :configuration
94
93
 
95
94
  def encoding
@@ -59,7 +59,6 @@ module ActiveRecord
59
59
  end
60
60
 
61
61
  private
62
-
63
62
  attr_reader :configuration, :root
64
63
 
65
64
  def run_cmd(cmd, args, out)
@@ -180,7 +180,6 @@ module ActiveRecord
180
180
  end
181
181
 
182
182
  private
183
-
184
183
  # Shares the writing connection pool with connections on
185
184
  # other handlers.
186
185
  #
@@ -195,6 +194,7 @@ module ActiveRecord
195
194
  handler.connection_pool_list.each do |pool|
196
195
  name = pool.spec.name
197
196
  writing_connection = writing_handler.retrieve_connection_pool(name)
197
+ return unless writing_connection
198
198
  handler.send(:owner_to_pool)[name] = writing_connection
199
199
  end
200
200
  end
@@ -96,7 +96,6 @@ module ActiveRecord
96
96
  end
97
97
 
98
98
  private
99
-
100
99
  def _create_record
101
100
  if record_timestamps
102
101
  current_time = current_time_from_proper_timezone
@@ -9,7 +9,7 @@ module ActiveRecord
9
9
  before_commit_without_transaction_enrollment :touch_deferred_attributes
10
10
  end
11
11
 
12
- def touch_later(*names) # :nodoc:
12
+ def touch_later(*names, **) # :nodoc:
13
13
  unless persisted?
14
14
  raise ActiveRecordError, <<-MSG.squish
15
15
  cannot touch on a new or destroyed record object. Consider using
@@ -41,7 +41,6 @@ module ActiveRecord
41
41
  end
42
42
 
43
43
  private
44
-
45
44
  def surreptitiously_touch(attrs)
46
45
  attrs.each { |attr| write_attribute attr, @_touch_time }
47
46
  clear_attribute_changes attrs
@@ -208,8 +208,8 @@ module ActiveRecord
208
208
  # Note that "TRUNCATE" is also a MySQL DDL statement!
209
209
  module ClassMethods
210
210
  # See the ConnectionAdapters::DatabaseStatements#transaction API docs.
211
- def transaction(options = {}, &block)
212
- connection.transaction(options, &block)
211
+ def transaction(**options, &block)
212
+ connection.transaction(**options, &block)
213
213
  end
214
214
 
215
215
  def before_commit(*args, &block) # :nodoc:
@@ -282,7 +282,6 @@ module ActiveRecord
282
282
  end
283
283
 
284
284
  private
285
-
286
285
  def set_options_for_callbacks!(args, enforced_options = {})
287
286
  options = args.extract_options!.merge!(enforced_options)
288
287
  args << options
@@ -304,22 +303,22 @@ module ActiveRecord
304
303
 
305
304
  # See ActiveRecord::Transactions::ClassMethods for detailed documentation.
306
305
  def transaction(options = {}, &block)
307
- self.class.transaction(options, &block)
306
+ self.class.transaction(**options, &block)
308
307
  end
309
308
 
310
309
  def destroy #:nodoc:
311
310
  with_transaction_returning_status { super }
312
311
  end
313
312
 
314
- def save(*) #:nodoc:
313
+ def save(*, **) #:nodoc:
315
314
  with_transaction_returning_status { super }
316
315
  end
317
316
 
318
- def save!(*) #:nodoc:
317
+ def save!(*, **) #:nodoc:
319
318
  with_transaction_returning_status { super }
320
319
  end
321
320
 
322
- def touch(*) #:nodoc:
321
+ def touch(*, **) #:nodoc:
323
322
  with_transaction_returning_status { super }
324
323
  end
325
324
 
@@ -340,7 +339,7 @@ module ActiveRecord
340
339
  _run_commit_callbacks
341
340
  end
342
341
  ensure
343
- @_committed_already_called = false
342
+ @_committed_already_called = @_trigger_update_callback = @_trigger_destroy_callback = false
344
343
  end
345
344
 
346
345
  # Call the #after_rollback callbacks. The +force_restore_state+ argument indicates if the record
@@ -353,6 +352,7 @@ module ActiveRecord
353
352
  ensure
354
353
  restore_transaction_record_state(force_restore_state)
355
354
  clear_transaction_record_state
355
+ @_trigger_update_callback = @_trigger_destroy_callback = false if force_restore_state
356
356
  end
357
357
 
358
358
  # Executes +method+ within a transaction and captures its return value as a