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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +251 -3
- data/README.rdoc +1 -1
- data/lib/active_record.rb +1 -0
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +0 -1
- data/lib/active_record/association_relation.rb +10 -8
- data/lib/active_record/associations.rb +2 -2
- data/lib/active_record/associations/alias_tracker.rb +0 -1
- data/lib/active_record/associations/association.rb +5 -1
- data/lib/active_record/associations/builder/collection_association.rb +2 -2
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -3
- data/lib/active_record/associations/collection_association.rb +6 -2
- data/lib/active_record/associations/collection_proxy.rb +2 -3
- data/lib/active_record/associations/has_many_association.rb +0 -1
- data/lib/active_record/associations/join_dependency.rb +23 -9
- data/lib/active_record/associations/join_dependency/join_association.rb +12 -3
- data/lib/active_record/associations/preloader.rb +2 -3
- data/lib/active_record/associations/preloader/association.rb +3 -1
- data/lib/active_record/attribute_assignment.rb +0 -1
- data/lib/active_record/attribute_decorators.rb +0 -2
- data/lib/active_record/attribute_methods.rb +0 -51
- data/lib/active_record/attribute_methods/before_type_cast.rb +0 -1
- data/lib/active_record/attribute_methods/dirty.rb +8 -3
- data/lib/active_record/attribute_methods/primary_key.rb +0 -2
- data/lib/active_record/attribute_methods/read.rb +0 -1
- data/lib/active_record/attribute_methods/serialization.rb +0 -1
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +0 -2
- data/lib/active_record/attribute_methods/write.rb +0 -1
- data/lib/active_record/attributes.rb +0 -1
- data/lib/active_record/autosave_association.rb +11 -7
- data/lib/active_record/callbacks.rb +1 -2
- data/lib/active_record/coders/yaml_column.rb +0 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +107 -13
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +21 -15
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +5 -5
- data/lib/active_record/connection_adapters/abstract/quoting.rb +53 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +1 -2
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +27 -27
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +55 -37
- data/lib/active_record/connection_adapters/abstract/transaction.rb +14 -7
- data/lib/active_record/connection_adapters/abstract_adapter.rb +62 -25
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +25 -32
- data/lib/active_record/connection_adapters/connection_specification.rb +3 -4
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -2
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +8 -12
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +0 -1
- data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +3 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +8 -8
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +12 -4
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +9 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +39 -2
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +15 -29
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +17 -3
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +8 -7
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +38 -3
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +3 -3
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +23 -8
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_handling.rb +17 -22
- data/lib/active_record/core.rb +8 -6
- data/lib/active_record/counter_cache.rb +4 -1
- data/lib/active_record/database_configurations.rb +60 -31
- data/lib/active_record/database_configurations/url_config.rb +0 -1
- data/lib/active_record/dynamic_matchers.rb +2 -3
- data/lib/active_record/enum.rb +9 -0
- data/lib/active_record/explain.rb +0 -1
- data/lib/active_record/fixture_set/table_row.rb +0 -1
- data/lib/active_record/fixture_set/table_rows.rb +0 -1
- data/lib/active_record/fixtures.rb +11 -9
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/inheritance.rb +0 -3
- data/lib/active_record/insert_all.rb +5 -6
- data/lib/active_record/internal_metadata.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +0 -1
- data/lib/active_record/log_subscriber.rb +1 -1
- data/lib/active_record/middleware/database_selector.rb +3 -4
- data/lib/active_record/middleware/database_selector/resolver.rb +5 -8
- data/lib/active_record/migration.rb +43 -32
- data/lib/active_record/migration/command_recorder.rb +6 -18
- data/lib/active_record/migration/compatibility.rb +3 -3
- data/lib/active_record/migration/join_table.rb +0 -1
- data/lib/active_record/model_schema.rb +3 -2
- data/lib/active_record/nested_attributes.rb +0 -2
- data/lib/active_record/no_touching.rb +2 -2
- data/lib/active_record/null_relation.rb +0 -1
- data/lib/active_record/persistence.rb +4 -5
- data/lib/active_record/querying.rb +1 -1
- data/lib/active_record/railtie.rb +1 -2
- data/lib/active_record/railties/collection_cache_association_loading.rb +1 -1
- data/lib/active_record/railties/databases.rake +63 -23
- data/lib/active_record/reflection.rb +9 -9
- data/lib/active_record/relation.rb +13 -1
- data/lib/active_record/relation/batches.rb +0 -1
- data/lib/active_record/relation/calculations.rb +3 -5
- data/lib/active_record/relation/delegation.rb +7 -6
- data/lib/active_record/relation/finder_methods.rb +14 -4
- data/lib/active_record/relation/from_clause.rb +4 -0
- data/lib/active_record/relation/merger.rb +6 -3
- data/lib/active_record/relation/predicate_builder.rb +1 -5
- data/lib/active_record/relation/query_methods.rb +94 -55
- data/lib/active_record/relation/spawn_methods.rb +0 -1
- data/lib/active_record/relation/where_clause.rb +0 -1
- data/lib/active_record/result.rb +0 -1
- data/lib/active_record/sanitization.rb +30 -2
- data/lib/active_record/schema.rb +1 -1
- data/lib/active_record/schema_dumper.rb +5 -1
- data/lib/active_record/schema_migration.rb +1 -1
- data/lib/active_record/scoping.rb +0 -1
- data/lib/active_record/scoping/default.rb +0 -1
- data/lib/active_record/scoping/named.rb +3 -3
- data/lib/active_record/store.rb +1 -1
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +21 -10
- data/lib/active_record/tasks/database_tasks.rb +76 -8
- data/lib/active_record/tasks/mysql_database_tasks.rb +3 -2
- data/lib/active_record/tasks/postgresql_database_tasks.rb +0 -1
- data/lib/active_record/tasks/sqlite_database_tasks.rb +0 -1
- data/lib/active_record/test_databases.rb +1 -16
- data/lib/active_record/test_fixtures.rb +2 -1
- data/lib/active_record/timestamp.rb +26 -17
- data/lib/active_record/touch_later.rb +3 -2
- data/lib/active_record/transactions.rb +18 -19
- data/lib/active_record/type.rb +0 -1
- data/lib/active_record/type/adapter_specific_registry.rb +2 -5
- data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
- data/lib/active_record/type/serialized.rb +0 -1
- data/lib/active_record/type/type_map.rb +0 -1
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type_caster/connection.rb +16 -10
- data/lib/active_record/validations.rb +3 -3
- data/lib/active_record/validations/associated.rb +1 -2
- data/lib/arel.rb +17 -6
- data/lib/arel/predications.rb +5 -6
- data/lib/arel/visitors/depth_first.rb +1 -2
- data/lib/arel/visitors/dot.rb +0 -1
- data/lib/arel/visitors/mssql.rb +0 -1
- data/lib/arel/visitors/oracle.rb +1 -2
- data/lib/arel/visitors/oracle12.rb +0 -1
- data/lib/arel/visitors/postgresql.rb +0 -1
- data/lib/arel/visitors/sqlite.rb +0 -1
- data/lib/arel/visitors/to_sql.rb +23 -27
- data/lib/arel/visitors/visitor.rb +9 -6
- data/lib/arel/visitors/where_sql.rb +0 -1
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/migration.rb +0 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +0 -1
- metadata +13 -9
data/lib/active_record/core.rb
CHANGED
@@ -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 =
|
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
|
-
|
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
|
-
|
108
|
-
|
109
|
-
|
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
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
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.
|
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
|
-
|
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
|
154
|
-
|
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
|
-
|
157
|
-
|
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)
|
@@ -49,9 +49,9 @@ module ActiveRecord
|
|
49
49
|
|
50
50
|
attr_reader :model, :name, :attribute_names
|
51
51
|
|
52
|
-
def initialize(model,
|
52
|
+
def initialize(model, method_name)
|
53
53
|
@model = model
|
54
|
-
@name =
|
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
|
data/lib/active_record/enum.rb
CHANGED
@@ -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
|
@@ -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? ?
|
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
|
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
|
@@ -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.
|
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::
|
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.
|
167
|
+
keys.index_with { |key| model.type_for_attribute(key) }
|
169
168
|
end
|
170
169
|
|
171
170
|
def format_columns(columns)
|
@@ -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
|