activerecord 6.0.0.rc2 → 6.0.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +101 -3
- data/lib/active_record/association_relation.rb +15 -6
- data/lib/active_record/associations.rb +1 -1
- data/lib/active_record/associations/association.rb +9 -1
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -1
- data/lib/active_record/associations/join_dependency.rb +4 -0
- data/lib/active_record/associations/join_dependency/join_association.rb +1 -1
- data/lib/active_record/associations/preloader.rb +1 -1
- data/lib/active_record/autosave_association.rb +7 -3
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +25 -10
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -0
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +2 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1 -1
- data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -3
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +13 -4
- data/lib/active_record/connection_adapters/connection_specification.rb +2 -2
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +3 -1
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +4 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +3 -1
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +4 -0
- data/lib/active_record/connection_handling.rb +11 -4
- data/lib/active_record/core.rb +8 -4
- data/lib/active_record/database_configurations.rb +60 -31
- data/lib/active_record/enum.rb +9 -0
- data/lib/active_record/fixtures.rb +11 -6
- data/lib/active_record/gem_version.rb +2 -2
- data/lib/active_record/insert_all.rb +2 -3
- data/lib/active_record/middleware/database_selector/resolver.rb +4 -6
- data/lib/active_record/migration.rb +13 -5
- data/lib/active_record/model_schema.rb +3 -0
- data/lib/active_record/railties/databases.rake +6 -3
- data/lib/active_record/relation.rb +1 -0
- data/lib/active_record/relation/calculations.rb +1 -3
- data/lib/active_record/relation/finder_methods.rb +10 -1
- data/lib/active_record/relation/query_methods.rb +47 -21
- data/lib/active_record/tasks/database_tasks.rb +35 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +1 -1
- data/lib/active_record/test_databases.rb +1 -16
- data/lib/active_record/transactions.rb +1 -1
- data/lib/active_record/validations.rb +1 -0
- data/lib/arel.rb +12 -5
- metadata +12 -9
@@ -46,11 +46,9 @@ module ActiveRecord
|
|
46
46
|
private
|
47
47
|
|
48
48
|
def read_from_primary(&blk)
|
49
|
-
ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role) do
|
50
|
-
|
51
|
-
|
52
|
-
yield
|
53
|
-
end
|
49
|
+
ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role, prevent_writes: true) do
|
50
|
+
instrumenter.instrument("database_selector.active_record.read_from_primary") do
|
51
|
+
yield
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
@@ -64,7 +62,7 @@ module ActiveRecord
|
|
64
62
|
end
|
65
63
|
|
66
64
|
def write_to_primary(&blk)
|
67
|
-
ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role) do
|
65
|
+
ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role, prevent_writes: false) do
|
68
66
|
instrumenter.instrument("database_selector.active_record.wrote_to_primary") do
|
69
67
|
yield
|
70
68
|
ensure
|
@@ -588,18 +588,26 @@ module ActiveRecord
|
|
588
588
|
end
|
589
589
|
|
590
590
|
def load_schema_if_pending!
|
591
|
-
|
591
|
+
current_config = Base.connection_config
|
592
|
+
all_configs = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env)
|
593
|
+
|
594
|
+
needs_update = !all_configs.all? do |db_config|
|
595
|
+
Tasks::DatabaseTasks.schema_up_to_date?(db_config.config, ActiveRecord::Base.schema_format, nil, Rails.env, db_config.spec_name)
|
596
|
+
end
|
597
|
+
|
598
|
+
if needs_update
|
592
599
|
# Roundtrip to Rake to allow plugins to hook into database initialization.
|
593
600
|
root = defined?(ENGINE_ROOT) ? ENGINE_ROOT : Rails.root
|
594
601
|
FileUtils.cd(root) do
|
595
|
-
current_config = Base.connection_config
|
596
602
|
Base.clear_all_connections!
|
597
603
|
system("bin/rails db:test:prepare")
|
598
|
-
# Establish a new connection, the old database may be gone (db:test:prepare uses purge)
|
599
|
-
Base.establish_connection(current_config)
|
600
604
|
end
|
601
|
-
check_pending!
|
602
605
|
end
|
606
|
+
|
607
|
+
# Establish a new connection, the old database may be gone (db:test:prepare uses purge)
|
608
|
+
Base.establish_connection(current_config)
|
609
|
+
|
610
|
+
check_pending!
|
603
611
|
end
|
604
612
|
|
605
613
|
def maintain_test_schema! #:nodoc:
|
@@ -265,6 +265,8 @@ db_namespace = namespace :db do
|
|
265
265
|
end
|
266
266
|
abort %{Run `rails db:migrate` to update your database then try again.}
|
267
267
|
end
|
268
|
+
ensure
|
269
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)
|
268
270
|
end
|
269
271
|
|
270
272
|
namespace :abort_if_pending_migrations do
|
@@ -297,10 +299,11 @@ db_namespace = namespace :db do
|
|
297
299
|
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
|
298
300
|
ActiveRecord::Base.establish_connection(db_config.config)
|
299
301
|
|
300
|
-
ActiveRecord::Tasks::DatabaseTasks.migrate
|
301
|
-
|
302
302
|
# Skipped when no database
|
303
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
303
|
+
ActiveRecord::Tasks::DatabaseTasks.migrate
|
304
|
+
if ActiveRecord::Base.dump_schema_after_migration
|
305
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config.config, ActiveRecord::Base.schema_format, db_config.spec_name)
|
306
|
+
end
|
304
307
|
|
305
308
|
rescue ActiveRecord::NoDatabaseError
|
306
309
|
ActiveRecord::Tasks::DatabaseTasks.create_current(db_config.env_name, db_config.spec_name)
|
@@ -321,7 +321,7 @@ module ActiveRecord
|
|
321
321
|
}
|
322
322
|
group_columns = group_aliases.zip(group_fields)
|
323
323
|
|
324
|
-
aggregate_alias = column_alias_for("#{operation}
|
324
|
+
aggregate_alias = column_alias_for("#{operation} #{column_name.to_s.downcase}")
|
325
325
|
|
326
326
|
select_values = [
|
327
327
|
operation_over_aggregate_column(
|
@@ -374,8 +374,6 @@ module ActiveRecord
|
|
374
374
|
# column_alias_for("count(distinct users.id)") # => "count_distinct_users_id"
|
375
375
|
# column_alias_for("count(*)") # => "count_all"
|
376
376
|
def column_alias_for(field)
|
377
|
-
return field if field.match?(/\A\w{,#{connection.table_alias_length}}\z/)
|
378
|
-
|
379
377
|
column_alias = +field
|
380
378
|
column_alias.gsub!(/\*/, "all")
|
381
379
|
column_alias.gsub!(/\W+/, " ")
|
@@ -376,7 +376,16 @@ module ActiveRecord
|
|
376
376
|
)
|
377
377
|
relation = except(:includes, :eager_load, :preload).joins!(join_dependency)
|
378
378
|
|
379
|
-
if eager_loading && !
|
379
|
+
if eager_loading && !(
|
380
|
+
using_limitable_reflections?(join_dependency.reflections) &&
|
381
|
+
using_limitable_reflections?(
|
382
|
+
construct_join_dependency(
|
383
|
+
select_association_list(joins_values).concat(
|
384
|
+
select_association_list(left_outer_joins_values)
|
385
|
+
), nil
|
386
|
+
).reflections
|
387
|
+
)
|
388
|
+
)
|
380
389
|
if has_limit_or_offset?
|
381
390
|
limited_ids = limited_ids_for(relation)
|
382
391
|
limited_ids.empty? ? relation.none! : relation.where!(primary_key => limited_ids)
|
@@ -372,7 +372,7 @@ module ActiveRecord
|
|
372
372
|
|
373
373
|
# Same as #reorder but operates on relation in-place instead of copying.
|
374
374
|
def reorder!(*args) # :nodoc:
|
375
|
-
preprocess_order_args(args)
|
375
|
+
preprocess_order_args(args) unless args.all?(&:blank?)
|
376
376
|
|
377
377
|
self.reordering_value = true
|
378
378
|
self.order_values = args
|
@@ -1083,38 +1083,68 @@ module ActiveRecord
|
|
1083
1083
|
end
|
1084
1084
|
end
|
1085
1085
|
|
1086
|
-
def
|
1086
|
+
def select_association_list(associations)
|
1087
|
+
result = []
|
1087
1088
|
associations.each do |association|
|
1088
1089
|
case association
|
1089
1090
|
when Hash, Symbol, Array
|
1090
|
-
|
1091
|
+
result << association
|
1091
1092
|
else
|
1092
|
-
|
1093
|
+
yield if block_given?
|
1093
1094
|
end
|
1094
1095
|
end
|
1096
|
+
result
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
def valid_association_list(associations)
|
1100
|
+
select_association_list(associations) do
|
1101
|
+
raise ArgumentError, "only Hash, Symbol and Array are allowed"
|
1102
|
+
end
|
1095
1103
|
end
|
1096
1104
|
|
1097
1105
|
def build_left_outer_joins(manager, outer_joins, aliases)
|
1098
|
-
buckets = {
|
1106
|
+
buckets = Hash.new { |h, k| h[k] = [] }
|
1107
|
+
buckets[:association_join] = valid_association_list(outer_joins)
|
1099
1108
|
build_join_query(manager, buckets, Arel::Nodes::OuterJoin, aliases)
|
1100
1109
|
end
|
1101
1110
|
|
1102
1111
|
def build_joins(manager, joins, aliases)
|
1112
|
+
buckets = Hash.new { |h, k| h[k] = [] }
|
1113
|
+
|
1103
1114
|
unless left_outer_joins_values.empty?
|
1104
1115
|
left_joins = valid_association_list(left_outer_joins_values.flatten)
|
1105
|
-
|
1116
|
+
buckets[:stashed_join] << construct_join_dependency(left_joins, Arel::Nodes::OuterJoin)
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
if joins.last.is_a?(ActiveRecord::Associations::JoinDependency)
|
1120
|
+
buckets[:stashed_join] << joins.pop if joins.last.base_klass == klass
|
1106
1121
|
end
|
1107
1122
|
|
1108
|
-
|
1123
|
+
joins.map! do |join|
|
1124
|
+
if join.is_a?(String)
|
1125
|
+
table.create_string_join(Arel.sql(join.strip)) unless join.blank?
|
1126
|
+
else
|
1127
|
+
join
|
1128
|
+
end
|
1129
|
+
end.delete_if(&:blank?).uniq!
|
1130
|
+
|
1131
|
+
while joins.first.is_a?(Arel::Nodes::Join)
|
1132
|
+
join_node = joins.shift
|
1133
|
+
if join_node.is_a?(Arel::Nodes::StringJoin) && !buckets[:stashed_join].empty?
|
1134
|
+
buckets[:join_node] << join_node
|
1135
|
+
else
|
1136
|
+
buckets[:leading_join] << join_node
|
1137
|
+
end
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
joins.each do |join|
|
1109
1141
|
case join
|
1110
|
-
when String
|
1111
|
-
:string_join
|
1112
1142
|
when Hash, Symbol, Array
|
1113
|
-
:association_join
|
1143
|
+
buckets[:association_join] << join
|
1114
1144
|
when ActiveRecord::Associations::JoinDependency
|
1115
|
-
:stashed_join
|
1145
|
+
buckets[:stashed_join] << join
|
1116
1146
|
when Arel::Nodes::Join
|
1117
|
-
:join_node
|
1147
|
+
buckets[:join_node] << join
|
1118
1148
|
else
|
1119
1149
|
raise "unknown class: %s" % join.class.name
|
1120
1150
|
end
|
@@ -1124,25 +1154,21 @@ module ActiveRecord
|
|
1124
1154
|
end
|
1125
1155
|
|
1126
1156
|
def build_join_query(manager, buckets, join_type, aliases)
|
1127
|
-
buckets.default = []
|
1128
|
-
|
1129
1157
|
association_joins = buckets[:association_join]
|
1130
1158
|
stashed_joins = buckets[:stashed_join]
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
string_joins.map! { |join| table.create_string_join(Arel.sql(join)) }
|
1159
|
+
leading_joins = buckets[:leading_join]
|
1160
|
+
join_nodes = buckets[:join_node]
|
1135
1161
|
|
1136
1162
|
join_sources = manager.join_sources
|
1137
|
-
join_sources.concat(
|
1163
|
+
join_sources.concat(leading_joins) unless leading_joins.empty?
|
1138
1164
|
|
1139
1165
|
unless association_joins.empty? && stashed_joins.empty?
|
1140
|
-
alias_tracker = alias_tracker(
|
1166
|
+
alias_tracker = alias_tracker(leading_joins + join_nodes, aliases)
|
1141
1167
|
join_dependency = construct_join_dependency(association_joins, join_type)
|
1142
1168
|
join_sources.concat(join_dependency.join_constraints(stashed_joins, alias_tracker))
|
1143
1169
|
end
|
1144
1170
|
|
1145
|
-
join_sources.concat(
|
1171
|
+
join_sources.concat(join_nodes) unless join_nodes.empty?
|
1146
1172
|
end
|
1147
1173
|
|
1148
1174
|
def build_select(arel)
|
@@ -154,6 +154,8 @@ module ActiveRecord
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def for_each(databases)
|
157
|
+
return {} unless defined?(Rails)
|
158
|
+
|
157
159
|
database_configs = ActiveRecord::DatabaseConfigurations.new(databases).configs_for(env_name: Rails.env)
|
158
160
|
|
159
161
|
# if this is a single database application we don't want tasks for each primary database
|
@@ -331,10 +333,39 @@ module ActiveRecord
|
|
331
333
|
end
|
332
334
|
ActiveRecord::InternalMetadata.create_table
|
333
335
|
ActiveRecord::InternalMetadata[:environment] = environment
|
336
|
+
ActiveRecord::InternalMetadata[:schema_sha1] = schema_sha1(file)
|
334
337
|
ensure
|
335
338
|
Migration.verbose = verbose_was
|
336
339
|
end
|
337
340
|
|
341
|
+
def schema_up_to_date?(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary")
|
342
|
+
file ||= dump_filename(spec_name, format)
|
343
|
+
|
344
|
+
return true unless File.exist?(file)
|
345
|
+
|
346
|
+
ActiveRecord::Base.establish_connection(configuration)
|
347
|
+
return false unless ActiveRecord::InternalMetadata.table_exists?
|
348
|
+
ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file)
|
349
|
+
end
|
350
|
+
|
351
|
+
def reconstruct_from_schema(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary") # :nodoc:
|
352
|
+
file ||= dump_filename(spec_name, format)
|
353
|
+
|
354
|
+
check_schema_file(file)
|
355
|
+
|
356
|
+
ActiveRecord::Base.establish_connection(configuration)
|
357
|
+
|
358
|
+
if schema_up_to_date?(configuration, format, file, environment, spec_name)
|
359
|
+
truncate_tables(configuration)
|
360
|
+
else
|
361
|
+
purge(configuration)
|
362
|
+
load_schema(configuration, format, file, environment, spec_name)
|
363
|
+
end
|
364
|
+
rescue ActiveRecord::NoDatabaseError
|
365
|
+
create(configuration)
|
366
|
+
load_schema(configuration, format, file, environment, spec_name)
|
367
|
+
end
|
368
|
+
|
338
369
|
def dump_schema(configuration, format = ActiveRecord::Base.schema_format, spec_name = "primary") # :nodoc:
|
339
370
|
require "active_record/schema_dumper"
|
340
371
|
filename = dump_filename(spec_name, format)
|
@@ -466,6 +497,10 @@ module ActiveRecord
|
|
466
497
|
def local_database?(configuration)
|
467
498
|
configuration["host"].blank? || LOCAL_HOSTS.include?(configuration["host"])
|
468
499
|
end
|
500
|
+
|
501
|
+
def schema_sha1(file)
|
502
|
+
Digest::SHA1.hexdigest(File.read(file))
|
503
|
+
end
|
469
504
|
end
|
470
505
|
end
|
471
506
|
end
|
@@ -16,7 +16,7 @@ module ActiveRecord
|
|
16
16
|
connection.create_database configuration["database"], creation_options
|
17
17
|
establish_connection configuration
|
18
18
|
rescue ActiveRecord::StatementInvalid => error
|
19
|
-
if error.cause
|
19
|
+
if connection.error_number(error.cause) == ER_DB_CREATE_EXISTS
|
20
20
|
raise DatabaseAlreadyExists
|
21
21
|
else
|
22
22
|
raise
|
@@ -8,31 +8,16 @@ module ActiveRecord
|
|
8
8
|
create_and_load_schema(i, env_name: Rails.env)
|
9
9
|
end
|
10
10
|
|
11
|
-
ActiveSupport::Testing::Parallelization.run_cleanup_hook do
|
12
|
-
drop(env_name: Rails.env)
|
13
|
-
end
|
14
|
-
|
15
11
|
def self.create_and_load_schema(i, env_name:)
|
16
12
|
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
|
17
13
|
|
18
14
|
ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
|
19
15
|
db_config.config["database"] += "-#{i}"
|
20
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
21
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
|
16
|
+
ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name)
|
22
17
|
end
|
23
18
|
ensure
|
24
19
|
ActiveRecord::Base.establish_connection(Rails.env.to_sym)
|
25
20
|
ENV["VERBOSE"] = old
|
26
21
|
end
|
27
|
-
|
28
|
-
def self.drop(env_name:)
|
29
|
-
old, ENV["VERBOSE"] = ENV["VERBOSE"], "false"
|
30
|
-
|
31
|
-
ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config|
|
32
|
-
ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config)
|
33
|
-
end
|
34
|
-
ensure
|
35
|
-
ENV["VERBOSE"] = old
|
36
|
-
end
|
37
22
|
end
|
38
23
|
end
|
@@ -333,6 +333,7 @@ module ActiveRecord
|
|
333
333
|
# Ensure that it is not called if the object was never persisted (failed create),
|
334
334
|
# but call it after the commit of a destroyed object.
|
335
335
|
def committed!(should_run_callbacks: true) #:nodoc:
|
336
|
+
force_clear_transaction_record_state
|
336
337
|
if should_run_callbacks
|
337
338
|
@_committed_already_called = true
|
338
339
|
_run_commit_without_transaction_enrollment_callbacks
|
@@ -340,7 +341,6 @@ module ActiveRecord
|
|
340
341
|
end
|
341
342
|
ensure
|
342
343
|
@_committed_already_called = false
|
343
|
-
force_clear_transaction_record_state
|
344
344
|
end
|
345
345
|
|
346
346
|
# Call the #after_rollback callbacks. The +force_restore_state+ argument indicates if the record
|
@@ -40,6 +40,7 @@ module ActiveRecord
|
|
40
40
|
include ActiveModel::Validations
|
41
41
|
|
42
42
|
# The validation process on save can be skipped by passing <tt>validate: false</tt>.
|
43
|
+
# The validation context can be changed by passing <tt>context: context</tt>.
|
43
44
|
# The regular {ActiveRecord::Base#save}[rdoc-ref:Persistence#save] method is replaced
|
44
45
|
# with this when the validations module is mixed in, which it is by default.
|
45
46
|
def save(options = {})
|
data/lib/arel.rb
CHANGED
@@ -24,22 +24,29 @@ require "arel/update_manager"
|
|
24
24
|
require "arel/delete_manager"
|
25
25
|
require "arel/nodes"
|
26
26
|
|
27
|
-
module Arel
|
27
|
+
module Arel
|
28
28
|
VERSION = "10.0.0"
|
29
29
|
|
30
|
+
# Wrap a known-safe SQL string for passing to query methods, e.g.
|
31
|
+
#
|
32
|
+
# Post.order(Arel.sql("length(title)")).last
|
33
|
+
#
|
34
|
+
# Great caution should be taken to avoid SQL injection vulnerabilities.
|
35
|
+
# This method should not be used with unsafe values such as request
|
36
|
+
# parameters or model attributes.
|
30
37
|
def self.sql(raw_sql)
|
31
38
|
Arel::Nodes::SqlLiteral.new raw_sql
|
32
39
|
end
|
33
40
|
|
34
|
-
def self.star
|
41
|
+
def self.star # :nodoc:
|
35
42
|
sql "*"
|
36
43
|
end
|
37
44
|
|
38
|
-
def self.arel_node?(value)
|
45
|
+
def self.arel_node?(value) # :nodoc:
|
39
46
|
value.is_a?(Arel::Node) || value.is_a?(Arel::Attribute) || value.is_a?(Arel::Nodes::SqlLiteral)
|
40
47
|
end
|
41
48
|
|
42
|
-
def self.fetch_attribute(value)
|
49
|
+
def self.fetch_attribute(value) # :nodoc:
|
43
50
|
case value
|
44
51
|
when Arel::Nodes::Between, Arel::Nodes::In, Arel::Nodes::NotIn, Arel::Nodes::Equality, Arel::Nodes::NotEqual, Arel::Nodes::LessThan, Arel::Nodes::LessThanOrEqual, Arel::Nodes::GreaterThan, Arel::Nodes::GreaterThanOrEqual
|
45
52
|
yield value.left.is_a?(Arel::Attributes::Attribute) ? value.left : value.right
|
@@ -47,5 +54,5 @@ module Arel # :nodoc: all
|
|
47
54
|
end
|
48
55
|
|
49
56
|
## Convenience Alias
|
50
|
-
Node = Arel::Nodes::Node
|
57
|
+
Node = Arel::Nodes::Node # :nodoc:
|
51
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.1.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 6.0.
|
19
|
+
version: 6.0.1.rc1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 6.0.
|
26
|
+
version: 6.0.1.rc1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activemodel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 6.0.
|
33
|
+
version: 6.0.1.rc1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 6.0.
|
40
|
+
version: 6.0.1.rc1
|
41
41
|
description: Databases on Rails. Build a persistent domain model by mapping database
|
42
42
|
tables to Ruby classes. Strong conventions for associations, validations, aggregations,
|
43
43
|
migrations, and testing come baked-in.
|
@@ -389,8 +389,11 @@ homepage: https://rubyonrails.org
|
|
389
389
|
licenses:
|
390
390
|
- MIT
|
391
391
|
metadata:
|
392
|
-
|
393
|
-
changelog_uri: https://github.com/rails/rails/blob/v6.0.
|
392
|
+
bug_tracker_uri: https://github.com/rails/rails/issues
|
393
|
+
changelog_uri: https://github.com/rails/rails/blob/v6.0.1.rc1/activerecord/CHANGELOG.md
|
394
|
+
documentation_uri: https://api.rubyonrails.org/v6.0.1.rc1/
|
395
|
+
mailing_list_uri: https://groups.google.com/forum/#!forum/rubyonrails-talk
|
396
|
+
source_code_uri: https://github.com/rails/rails/tree/v6.0.1.rc1/activerecord
|
394
397
|
post_install_message:
|
395
398
|
rdoc_options:
|
396
399
|
- "--main"
|
@@ -408,7 +411,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
408
411
|
- !ruby/object:Gem::Version
|
409
412
|
version: 1.3.1
|
410
413
|
requirements: []
|
411
|
-
rubygems_version: 3.0.
|
414
|
+
rubygems_version: 3.0.3
|
412
415
|
signing_key:
|
413
416
|
specification_version: 4
|
414
417
|
summary: Object-relational mapper framework (part of Rails).
|