activerecord 6.0.0.rc1 → 6.0.3.rc1

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.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +251 -3
  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 +10 -8
  8. data/lib/active_record/associations.rb +2 -2
  9. data/lib/active_record/associations/alias_tracker.rb +0 -1
  10. data/lib/active_record/associations/association.rb +5 -1
  11. data/lib/active_record/associations/builder/collection_association.rb +2 -2
  12. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -3
  13. data/lib/active_record/associations/collection_association.rb +6 -2
  14. data/lib/active_record/associations/collection_proxy.rb +2 -3
  15. data/lib/active_record/associations/has_many_association.rb +0 -1
  16. data/lib/active_record/associations/join_dependency.rb +23 -9
  17. data/lib/active_record/associations/join_dependency/join_association.rb +12 -3
  18. data/lib/active_record/associations/preloader.rb +2 -3
  19. data/lib/active_record/associations/preloader/association.rb +3 -1
  20. data/lib/active_record/attribute_assignment.rb +0 -1
  21. data/lib/active_record/attribute_decorators.rb +0 -2
  22. data/lib/active_record/attribute_methods.rb +0 -51
  23. data/lib/active_record/attribute_methods/before_type_cast.rb +0 -1
  24. data/lib/active_record/attribute_methods/dirty.rb +8 -3
  25. data/lib/active_record/attribute_methods/primary_key.rb +0 -2
  26. data/lib/active_record/attribute_methods/read.rb +0 -1
  27. data/lib/active_record/attribute_methods/serialization.rb +0 -1
  28. data/lib/active_record/attribute_methods/time_zone_conversion.rb +0 -2
  29. data/lib/active_record/attribute_methods/write.rb +0 -1
  30. data/lib/active_record/attributes.rb +0 -1
  31. data/lib/active_record/autosave_association.rb +11 -7
  32. data/lib/active_record/callbacks.rb +1 -2
  33. data/lib/active_record/coders/yaml_column.rb +0 -1
  34. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +107 -13
  35. data/lib/active_record/connection_adapters/abstract/database_statements.rb +21 -15
  36. data/lib/active_record/connection_adapters/abstract/query_cache.rb +5 -5
  37. data/lib/active_record/connection_adapters/abstract/quoting.rb +53 -0
  38. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +1 -2
  39. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +27 -27
  40. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -1
  41. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +55 -37
  42. data/lib/active_record/connection_adapters/abstract/transaction.rb +14 -7
  43. data/lib/active_record/connection_adapters/abstract_adapter.rb +62 -25
  44. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +25 -32
  45. data/lib/active_record/connection_adapters/connection_specification.rb +3 -4
  46. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -2
  47. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  48. data/lib/active_record/connection_adapters/mysql/database_statements.rb +8 -12
  49. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +0 -1
  50. data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
  51. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +1 -2
  52. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +3 -1
  53. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +8 -8
  54. data/lib/active_record/connection_adapters/mysql2_adapter.rb +12 -4
  55. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +9 -3
  56. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
  57. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  58. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
  59. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +0 -1
  60. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  61. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  62. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +0 -1
  63. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +0 -1
  64. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  65. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +0 -1
  66. data/lib/active_record/connection_adapters/postgresql/quoting.rb +39 -2
  67. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  68. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -2
  69. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
  70. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  71. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +15 -29
  72. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  73. data/lib/active_record/connection_adapters/postgresql_adapter.rb +17 -3
  74. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +8 -7
  75. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +38 -3
  76. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +3 -3
  77. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +23 -8
  78. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  79. data/lib/active_record/connection_handling.rb +17 -22
  80. data/lib/active_record/core.rb +8 -6
  81. data/lib/active_record/counter_cache.rb +4 -1
  82. data/lib/active_record/database_configurations.rb +60 -31
  83. data/lib/active_record/database_configurations/url_config.rb +0 -1
  84. data/lib/active_record/dynamic_matchers.rb +2 -3
  85. data/lib/active_record/enum.rb +9 -0
  86. data/lib/active_record/explain.rb +0 -1
  87. data/lib/active_record/fixture_set/table_row.rb +0 -1
  88. data/lib/active_record/fixture_set/table_rows.rb +0 -1
  89. data/lib/active_record/fixtures.rb +11 -9
  90. data/lib/active_record/gem_version.rb +1 -1
  91. data/lib/active_record/inheritance.rb +0 -3
  92. data/lib/active_record/insert_all.rb +5 -6
  93. data/lib/active_record/internal_metadata.rb +1 -1
  94. data/lib/active_record/locking/optimistic.rb +0 -1
  95. data/lib/active_record/log_subscriber.rb +1 -1
  96. data/lib/active_record/middleware/database_selector.rb +3 -4
  97. data/lib/active_record/middleware/database_selector/resolver.rb +5 -8
  98. data/lib/active_record/migration.rb +43 -32
  99. data/lib/active_record/migration/command_recorder.rb +6 -18
  100. data/lib/active_record/migration/compatibility.rb +3 -3
  101. data/lib/active_record/migration/join_table.rb +0 -1
  102. data/lib/active_record/model_schema.rb +3 -2
  103. data/lib/active_record/nested_attributes.rb +0 -2
  104. data/lib/active_record/no_touching.rb +2 -2
  105. data/lib/active_record/null_relation.rb +0 -1
  106. data/lib/active_record/persistence.rb +4 -5
  107. data/lib/active_record/querying.rb +1 -1
  108. data/lib/active_record/railtie.rb +1 -2
  109. data/lib/active_record/railties/collection_cache_association_loading.rb +1 -1
  110. data/lib/active_record/railties/databases.rake +63 -23
  111. data/lib/active_record/reflection.rb +9 -9
  112. data/lib/active_record/relation.rb +13 -1
  113. data/lib/active_record/relation/batches.rb +0 -1
  114. data/lib/active_record/relation/calculations.rb +3 -5
  115. data/lib/active_record/relation/delegation.rb +7 -6
  116. data/lib/active_record/relation/finder_methods.rb +14 -4
  117. data/lib/active_record/relation/from_clause.rb +4 -0
  118. data/lib/active_record/relation/merger.rb +6 -3
  119. data/lib/active_record/relation/predicate_builder.rb +1 -5
  120. data/lib/active_record/relation/query_methods.rb +94 -55
  121. data/lib/active_record/relation/spawn_methods.rb +0 -1
  122. data/lib/active_record/relation/where_clause.rb +0 -1
  123. data/lib/active_record/result.rb +0 -1
  124. data/lib/active_record/sanitization.rb +30 -2
  125. data/lib/active_record/schema.rb +1 -1
  126. data/lib/active_record/schema_dumper.rb +5 -1
  127. data/lib/active_record/schema_migration.rb +1 -1
  128. data/lib/active_record/scoping.rb +0 -1
  129. data/lib/active_record/scoping/default.rb +0 -1
  130. data/lib/active_record/scoping/named.rb +3 -3
  131. data/lib/active_record/store.rb +1 -1
  132. data/lib/active_record/suppressor.rb +2 -2
  133. data/lib/active_record/table_metadata.rb +21 -10
  134. data/lib/active_record/tasks/database_tasks.rb +76 -8
  135. data/lib/active_record/tasks/mysql_database_tasks.rb +3 -2
  136. data/lib/active_record/tasks/postgresql_database_tasks.rb +0 -1
  137. data/lib/active_record/tasks/sqlite_database_tasks.rb +0 -1
  138. data/lib/active_record/test_databases.rb +1 -16
  139. data/lib/active_record/test_fixtures.rb +2 -1
  140. data/lib/active_record/timestamp.rb +26 -17
  141. data/lib/active_record/touch_later.rb +3 -2
  142. data/lib/active_record/transactions.rb +18 -19
  143. data/lib/active_record/type.rb +0 -1
  144. data/lib/active_record/type/adapter_specific_registry.rb +2 -5
  145. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  146. data/lib/active_record/type/serialized.rb +0 -1
  147. data/lib/active_record/type/type_map.rb +0 -1
  148. data/lib/active_record/type/unsigned_integer.rb +0 -1
  149. data/lib/active_record/type_caster/connection.rb +16 -10
  150. data/lib/active_record/validations.rb +3 -3
  151. data/lib/active_record/validations/associated.rb +1 -2
  152. data/lib/arel.rb +17 -6
  153. data/lib/arel/predications.rb +5 -6
  154. data/lib/arel/visitors/depth_first.rb +1 -2
  155. data/lib/arel/visitors/dot.rb +0 -1
  156. data/lib/arel/visitors/mssql.rb +0 -1
  157. data/lib/arel/visitors/oracle.rb +1 -2
  158. data/lib/arel/visitors/oracle12.rb +0 -1
  159. data/lib/arel/visitors/postgresql.rb +0 -1
  160. data/lib/arel/visitors/sqlite.rb +0 -1
  161. data/lib/arel/visitors/to_sql.rb +23 -27
  162. data/lib/arel/visitors/visitor.rb +9 -6
  163. data/lib/arel/visitors/where_sql.rb +0 -1
  164. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  165. data/lib/rails/generators/active_record/migration.rb +0 -1
  166. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +1 -1
  167. data/lib/rails/generators/active_record/model/model_generator.rb +0 -1
  168. metadata +13 -9
@@ -286,7 +286,6 @@ module ActiveRecord
286
286
  end
287
287
 
288
288
  private
289
-
290
289
  def cached_find_by_statement(key, &block)
291
290
  cache = @find_by_statement_cache[connection.prepared_statements]
292
291
  cache.compute_if_absent(key) { StatementCache.create(connection, &block) }
@@ -554,7 +553,6 @@ module ActiveRecord
554
553
  end
555
554
 
556
555
  private
557
-
558
556
  # +Array#flatten+ will call +#to_ary+ (recursively) on each of the elements of
559
557
  # the array, and then rescues from the possible +NoMethodError+. If those elements are
560
558
  # +ActiveRecord::Base+'s, then this triggers the various +method_missing+'s that we have,
@@ -586,12 +584,16 @@ module ActiveRecord
586
584
  self.class.instance_method(:inspect).owner != ActiveRecord::Base.instance_method(:inspect).owner
587
585
  end
588
586
 
587
+ class InspectionMask < DelegateClass(::String)
588
+ def pretty_print(pp)
589
+ pp.text __getobj__
590
+ end
591
+ end
592
+ private_constant :InspectionMask
593
+
589
594
  def inspection_filter
590
595
  @inspection_filter ||= begin
591
- mask = DelegateClass(::String).new(ActiveSupport::ParameterFilter::FILTERED)
592
- def mask.pretty_print(pp)
593
- pp.text __getobj__
594
- end
596
+ mask = InspectionMask.new(ActiveSupport::ParameterFilter::FILTERED)
595
597
  ActiveSupport::ParameterFilter.new(self.class.filter_attributes, mask: mask)
596
598
  end
597
599
  end
@@ -51,7 +51,10 @@ module ActiveRecord
51
51
 
52
52
  if touch
53
53
  names = touch if touch != true
54
- updates.merge!(touch_attributes_with_time(*names))
54
+ names = Array.wrap(names)
55
+ options = names.extract_options!
56
+ touch_updates = touch_attributes_with_time(*names, **options)
57
+ updates.merge!(touch_updates)
55
58
  end
56
59
 
57
60
  unscoped.where(primary_key => object.id).update_all(updates)
@@ -9,6 +9,8 @@ module ActiveRecord
9
9
  # objects (either a HashConfig or UrlConfig) that are constructed from the
10
10
  # application's database configuration hash or URL string.
11
11
  class DatabaseConfigurations
12
+ class InvalidConfigurationError < StandardError; end
13
+
12
14
  attr_reader :configurations
13
15
  delegate :any?, to: :configurations
14
16
 
@@ -91,6 +93,19 @@ module ActiveRecord
91
93
  end
92
94
  alias :blank? :empty?
93
95
 
96
+ def each
97
+ throw_getter_deprecation(:each)
98
+ configurations.each { |config|
99
+ yield [config.env_name, config.config]
100
+ }
101
+ end
102
+
103
+ def first
104
+ throw_getter_deprecation(:first)
105
+ config = configurations.first
106
+ [config.env_name, config.config]
107
+ end
108
+
94
109
  private
95
110
  def env_with_configs(env = nil)
96
111
  if env
@@ -104,34 +119,48 @@ module ActiveRecord
104
119
  return configs.configurations if configs.is_a?(DatabaseConfigurations)
105
120
  return configs if configs.is_a?(Array)
106
121
 
107
- build_db_config = configs.each_pair.flat_map do |env_name, config|
108
- walk_configs(env_name.to_s, "primary", config)
109
- end.flatten.compact
122
+ db_configs = configs.flat_map do |env_name, config|
123
+ if config.is_a?(Hash) && config.all? { |_, v| v.is_a?(Hash) }
124
+ walk_configs(env_name.to_s, config)
125
+ else
126
+ build_db_config_from_raw_config(env_name.to_s, "primary", config)
127
+ end
128
+ end
129
+
130
+ current_env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s
110
131
 
111
- if url = ENV["DATABASE_URL"]
112
- build_url_config(url, build_db_config)
113
- else
114
- build_db_config
132
+ unless db_configs.find(&:for_current_env?)
133
+ db_configs << environment_url_config(current_env, "primary", {})
134
+ end
135
+
136
+ merge_db_environment_variables(current_env, db_configs.compact)
137
+ end
138
+
139
+ def walk_configs(env_name, config)
140
+ config.map do |spec_name, sub_config|
141
+ build_db_config_from_raw_config(env_name, spec_name.to_s, sub_config)
115
142
  end
116
143
  end
117
144
 
118
- def walk_configs(env_name, spec_name, config)
145
+ def build_db_config_from_raw_config(env_name, spec_name, config)
119
146
  case config
120
147
  when String
121
148
  build_db_config_from_string(env_name, spec_name, config)
122
149
  when Hash
123
150
  build_db_config_from_hash(env_name, spec_name, config.stringify_keys)
151
+ else
152
+ raise InvalidConfigurationError, "'{ #{env_name} => #{config} }' is not a valid configuration. Expected '#{config}' to be a URL string or a Hash."
124
153
  end
125
154
  end
126
155
 
127
156
  def build_db_config_from_string(env_name, spec_name, config)
128
157
  url = config
129
158
  uri = URI.parse(url)
130
- if uri.try(:scheme)
159
+ if uri.scheme
131
160
  ActiveRecord::DatabaseConfigurations::UrlConfig.new(env_name, spec_name, url)
161
+ else
162
+ raise InvalidConfigurationError, "'{ #{env_name} => #{config} }' is not a valid configuration. Expected '#{config}' to be a URL string or a Hash."
132
163
  end
133
- rescue URI::InvalidURIError
134
- ActiveRecord::DatabaseConfigurations::HashConfig.new(env_name, spec_name, config)
135
164
  end
136
165
 
137
166
  def build_db_config_from_hash(env_name, spec_name, config)
@@ -141,36 +170,36 @@ module ActiveRecord
141
170
  config_without_url.delete "url"
142
171
 
143
172
  ActiveRecord::DatabaseConfigurations::UrlConfig.new(env_name, spec_name, url, config_without_url)
144
- elsif config["database"] || (config.size == 1 && config.values.all? { |v| v.is_a? String })
145
- ActiveRecord::DatabaseConfigurations::HashConfig.new(env_name, spec_name, config)
146
173
  else
147
- config.each_pair.map do |sub_spec_name, sub_config|
148
- walk_configs(env_name, sub_spec_name, sub_config)
149
- end
174
+ ActiveRecord::DatabaseConfigurations::HashConfig.new(env_name, spec_name, config)
150
175
  end
151
176
  end
152
177
 
153
- def build_url_config(url, configs)
154
- env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call.to_s
178
+ def merge_db_environment_variables(current_env, configs)
179
+ configs.map do |config|
180
+ next config if config.url_config? || config.env_name != current_env
155
181
 
156
- if original_config = configs.find(&:for_current_env?)
157
- if original_config.url_config?
158
- configs
159
- else
160
- configs.map do |config|
161
- ActiveRecord::DatabaseConfigurations::UrlConfig.new(config.env_name, config.spec_name, url, config.config)
162
- end
163
- end
164
- else
165
- configs + [ActiveRecord::DatabaseConfigurations::UrlConfig.new(env, "primary", url)]
182
+ url_config = environment_url_config(current_env, config.spec_name, config.config)
183
+ url_config || config
166
184
  end
167
185
  end
168
186
 
187
+ def environment_url_config(env, spec_name, config)
188
+ url = environment_value_for(spec_name)
189
+ return unless url
190
+
191
+ ActiveRecord::DatabaseConfigurations::UrlConfig.new(env, spec_name, url, config)
192
+ end
193
+
194
+ def environment_value_for(spec_name)
195
+ spec_env_key = "#{spec_name.upcase}_DATABASE_URL"
196
+ url = ENV[spec_env_key]
197
+ url ||= ENV["DATABASE_URL"] if spec_name == "primary"
198
+ url
199
+ end
200
+
169
201
  def method_missing(method, *args, &blk)
170
202
  case method
171
- when :each, :first
172
- throw_getter_deprecation(method)
173
- configurations.send(method, *args, &blk)
174
203
  when :fetch
175
204
  throw_getter_deprecation(method)
176
205
  configs_for(env_name: args.first)
@@ -56,7 +56,6 @@ module ActiveRecord
56
56
  end
57
57
 
58
58
  private
59
-
60
59
  def build_url_hash(url)
61
60
  if url.nil? || /^jdbc:/.match?(url)
62
61
  { "url" => url }
@@ -49,9 +49,9 @@ module ActiveRecord
49
49
 
50
50
  attr_reader :model, :name, :attribute_names
51
51
 
52
- def initialize(model, name)
52
+ def initialize(model, method_name)
53
53
  @model = model
54
- @name = name.to_s
54
+ @name = method_name.to_s
55
55
  @attribute_names = @name.match(self.class.pattern)[1].split("_and_")
56
56
  @attribute_names.map! { |name| @model.attribute_aliases[name] || name }
57
57
  end
@@ -69,7 +69,6 @@ module ActiveRecord
69
69
  end
70
70
 
71
71
  private
72
-
73
72
  def body
74
73
  "#{finder}(#{attributes_hash})"
75
74
  end
@@ -200,6 +200,8 @@ module ActiveRecord
200
200
  # scope :active, -> { where(status: 0) }
201
201
  # scope :not_active, -> { where.not(status: 0) }
202
202
  if enum_scopes != false
203
+ klass.send(:detect_negative_condition!, value_method_name)
204
+
203
205
  klass.send(:detect_enum_conflict!, name, value_method_name, true)
204
206
  klass.scope value_method_name, -> { where(attr => value) }
205
207
 
@@ -261,5 +263,12 @@ module ActiveRecord
261
263
  source: source
262
264
  }
263
265
  end
266
+
267
+ def detect_negative_condition!(method_name)
268
+ if method_name.start_with?("not_") && logger
269
+ logger.warn "An enum element in #{self.name} uses the prefix 'not_'." \
270
+ " This will cause a conflict with auto generated negative scopes."
271
+ end
272
+ end
264
273
  end
265
274
  end
@@ -36,7 +36,6 @@ module ActiveRecord
36
36
  end
37
37
 
38
38
  private
39
-
40
39
  def render_bind(attr)
41
40
  value = if attr.type.binary? && attr.value
42
41
  "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
@@ -48,7 +48,6 @@ module ActiveRecord
48
48
  end
49
49
 
50
50
  private
51
-
52
51
  def model_metadata
53
52
  @table_rows.model_metadata
54
53
  end
@@ -29,7 +29,6 @@ module ActiveRecord
29
29
  end
30
30
 
31
31
  private
32
-
33
32
  def build_table_rows_from(table_name, fixtures, config)
34
33
  now = config.default_timezone == :utc ? Time.now.utc : Time.now
35
34
 
@@ -464,7 +464,6 @@ module ActiveRecord
464
464
  end
465
465
 
466
466
  private
467
-
468
467
  def insert_class(class_names, name, klass)
469
468
  # We only want to deal with AR objects.
470
469
  if klass && klass < ActiveRecord::Base
@@ -531,15 +530,15 @@ module ActiveRecord
531
530
  end
532
531
  end
533
532
 
534
- def create_fixtures(fixtures_directory, fixture_set_names, class_names = {}, config = ActiveRecord::Base)
533
+ def create_fixtures(fixtures_directory, fixture_set_names, class_names = {}, config = ActiveRecord::Base, &block)
535
534
  fixture_set_names = Array(fixture_set_names).map(&:to_s)
536
535
  class_names = ClassCache.new class_names, config
537
536
 
538
537
  # FIXME: Apparently JK uses this.
539
- connection = block_given? ? yield : ActiveRecord::Base.connection
538
+ connection = block_given? ? block : lambda { ActiveRecord::Base.connection }
540
539
 
541
540
  fixture_files_to_read = fixture_set_names.reject do |fs_name|
542
- fixture_is_cached?(connection, fs_name)
541
+ fixture_is_cached?(connection.call, fs_name)
543
542
  end
544
543
 
545
544
  if fixture_files_to_read.any?
@@ -549,9 +548,9 @@ module ActiveRecord
549
548
  class_names,
550
549
  connection,
551
550
  )
552
- cache_fixtures(connection, fixtures_map)
551
+ cache_fixtures(connection.call, fixtures_map)
553
552
  end
554
- cached_fixtures(connection, fixture_set_names)
553
+ cached_fixtures(connection.call, fixture_set_names)
555
554
  end
556
555
 
557
556
  # Returns a consistent, platform-independent identifier for +label+.
@@ -570,7 +569,6 @@ module ActiveRecord
570
569
  end
571
570
 
572
571
  private
573
-
574
572
  def read_and_insert(fixtures_directory, fixture_files, class_names, connection) # :nodoc:
575
573
  fixtures_map = {}
576
574
  fixture_sets = fixture_files.map do |fixture_set_name|
@@ -591,7 +589,11 @@ module ActiveRecord
591
589
 
592
590
  def insert(fixture_sets, connection) # :nodoc:
593
591
  fixture_sets_by_connection = fixture_sets.group_by do |fixture_set|
594
- fixture_set.model_class&.connection || connection
592
+ if fixture_set.model_class
593
+ fixture_set.model_class.connection
594
+ else
595
+ connection.call
596
+ end
595
597
  end
596
598
 
597
599
  fixture_sets_by_connection.each do |conn, set|
@@ -602,6 +604,7 @@ module ActiveRecord
602
604
  table_rows_for_connection[table].unshift(*rows)
603
605
  end
604
606
  end
607
+
605
608
  conn.insert_fixtures_set(table_rows_for_connection, table_rows_for_connection.keys)
606
609
 
607
610
  # Cap primary key sequences to max(pk).
@@ -661,7 +664,6 @@ module ActiveRecord
661
664
  end
662
665
 
663
666
  private
664
-
665
667
  def model_class=(class_name)
666
668
  if class_name.is_a?(Class) # TODO: Should be an AR::Base type class, or any?
667
669
  @model_class = class_name
@@ -9,7 +9,7 @@ module ActiveRecord
9
9
  module VERSION
10
10
  MAJOR = 6
11
11
  MINOR = 0
12
- TINY = 0
12
+ TINY = 3
13
13
  PRE = "rc1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
@@ -176,7 +176,6 @@ module ActiveRecord
176
176
  end
177
177
 
178
178
  protected
179
-
180
179
  # Returns the class type of the record using the current module as a prefix. So descendants of
181
180
  # MyApp::Business::Account would appear as MyApp::Business::AccountSubclass.
182
181
  def compute_type(type_name)
@@ -208,7 +207,6 @@ module ActiveRecord
208
207
  end
209
208
 
210
209
  private
211
-
212
210
  # Called by +instantiate+ to decide which class to use for a new
213
211
  # record instance. For single-table inheritance, we check the record
214
212
  # for a +type+ column and return the corresponding class.
@@ -272,7 +270,6 @@ module ActiveRecord
272
270
  end
273
271
 
274
272
  private
275
-
276
273
  def initialize_internals_callback
277
274
  super
278
275
  ensure_proper_type
@@ -24,7 +24,7 @@ module ActiveRecord
24
24
  message = +"#{model} "
25
25
  message << "Bulk " if inserts.many?
26
26
  message << (on_duplicate == :update ? "Upsert" : "Insert")
27
- connection.exec_query to_sql, message
27
+ connection.exec_insert_all to_sql, message
28
28
  end
29
29
 
30
30
  def updatable_columns
@@ -110,8 +110,7 @@ module ActiveRecord
110
110
  end
111
111
  end
112
112
 
113
-
114
- class Builder
113
+ class Builder # :nodoc:
115
114
  attr_reader :model
116
115
 
117
116
  delegate :skip_duplicates?, :update_duplicates?, :keys, to: :insert_all
@@ -121,7 +120,7 @@ module ActiveRecord
121
120
  end
122
121
 
123
122
  def into
124
- "INTO #{model.quoted_table_name}(#{columns_list})"
123
+ "INTO #{model.quoted_table_name} (#{columns_list})"
125
124
  end
126
125
 
127
126
  def values_list
@@ -131,7 +130,7 @@ module ActiveRecord
131
130
  connection.with_yaml_fallback(types[key].serialize(value))
132
131
  end
133
132
 
134
- Arel::InsertManager.new.create_values_list(values_list).to_sql
133
+ connection.visitor.compile(Arel::Nodes::ValuesList.new(values_list))
135
134
  end
136
135
 
137
136
  def returning
@@ -165,7 +164,7 @@ module ActiveRecord
165
164
  unknown_column = (keys - columns.keys).first
166
165
  raise UnknownAttributeError.new(model.new, unknown_column) if unknown_column
167
166
 
168
- keys.map { |key| [ key, connection.lookup_cast_type_from_column(columns[key]) ] }.to_h
167
+ keys.index_with { |key| model.type_for_attribute(key) }
169
168
  end
170
169
 
171
170
  def format_columns(columns)
@@ -38,7 +38,7 @@ module ActiveRecord
38
38
  key_options = connection.internal_string_options_for_primary_key
39
39
 
40
40
  connection.create_table(table_name, id: false) do |t|
41
- t.string :key, key_options
41
+ t.string :key, **key_options
42
42
  t.string :value
43
43
  t.timestamps
44
44
  end
@@ -156,7 +156,6 @@ module ActiveRecord
156
156
  end
157
157
 
158
158
  private
159
-
160
159
  # We need to apply this decorator here, rather than on module inclusion. The closure
161
160
  # created by the matcher would otherwise evaluate for `ActiveRecord::Base`, not the
162
161
  # sub class being decorated. As such, changes to `lock_optimistically`, or
@@ -40,7 +40,7 @@ module ActiveRecord
40
40
  end
41
41
 
42
42
  name = colorize_payload_name(name, payload[:name])
43
- sql = color(sql, sql_color(sql), true)
43
+ sql = color(sql, sql_color(sql), true) if colorize_logging
44
44
 
45
45
  debug " #{name} #{sql}#{binds}"
46
46
  end