activerecord 5.0.7 → 5.1.7
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 +5 -5
- data/CHANGELOG.md +657 -2080
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/examples/performance.rb +28 -28
- data/examples/simple.rb +3 -3
- data/lib/active_record/aggregations.rb +244 -244
- data/lib/active_record/association_relation.rb +5 -5
- data/lib/active_record/associations/alias_tracker.rb +10 -11
- data/lib/active_record/associations/association.rb +23 -5
- data/lib/active_record/associations/association_scope.rb +95 -81
- data/lib/active_record/associations/belongs_to_association.rb +7 -4
- data/lib/active_record/associations/builder/belongs_to.rb +30 -16
- data/lib/active_record/associations/builder/collection_association.rb +1 -2
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +27 -27
- data/lib/active_record/associations/collection_association.rb +36 -205
- data/lib/active_record/associations/collection_proxy.rb +132 -63
- data/lib/active_record/associations/has_many_association.rb +10 -19
- data/lib/active_record/associations/has_many_through_association.rb +12 -4
- data/lib/active_record/associations/has_one_association.rb +24 -28
- data/lib/active_record/associations/has_one_through_association.rb +5 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +4 -28
- data/lib/active_record/associations/join_dependency/join_base.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
- data/lib/active_record/associations/join_dependency.rb +121 -118
- data/lib/active_record/associations/preloader/association.rb +64 -64
- data/lib/active_record/associations/preloader/belongs_to.rb +0 -2
- data/lib/active_record/associations/preloader/collection_association.rb +6 -6
- data/lib/active_record/associations/preloader/has_many.rb +0 -2
- data/lib/active_record/associations/preloader/singular_association.rb +6 -8
- data/lib/active_record/associations/preloader/through_association.rb +41 -41
- data/lib/active_record/associations/preloader.rb +94 -94
- data/lib/active_record/associations/singular_association.rb +8 -25
- data/lib/active_record/associations/through_association.rb +2 -5
- data/lib/active_record/associations.rb +1591 -1562
- data/lib/active_record/attribute/user_provided_default.rb +4 -2
- data/lib/active_record/attribute.rb +98 -71
- data/lib/active_record/attribute_assignment.rb +61 -61
- data/lib/active_record/attribute_decorators.rb +35 -13
- data/lib/active_record/attribute_methods/before_type_cast.rb +7 -7
- data/lib/active_record/attribute_methods/dirty.rb +229 -46
- data/lib/active_record/attribute_methods/primary_key.rb +74 -73
- data/lib/active_record/attribute_methods/read.rb +39 -35
- data/lib/active_record/attribute_methods/serialization.rb +7 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +35 -58
- data/lib/active_record/attribute_methods/write.rb +30 -33
- data/lib/active_record/attribute_methods.rb +56 -65
- data/lib/active_record/attribute_mutation_tracker.rb +63 -11
- data/lib/active_record/attribute_set/builder.rb +27 -33
- data/lib/active_record/attribute_set/yaml_encoder.rb +41 -0
- data/lib/active_record/attribute_set.rb +9 -6
- data/lib/active_record/attributes.rb +22 -22
- data/lib/active_record/autosave_association.rb +18 -13
- data/lib/active_record/base.rb +24 -22
- data/lib/active_record/callbacks.rb +56 -14
- data/lib/active_record/coders/yaml_column.rb +9 -11
- data/lib/active_record/collection_cache_key.rb +3 -4
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +330 -284
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +1 -3
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +39 -37
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +32 -27
- data/lib/active_record/connection_adapters/abstract/quoting.rb +62 -51
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +10 -20
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +74 -79
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +53 -41
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +120 -100
- data/lib/active_record/connection_adapters/abstract/transaction.rb +49 -43
- data/lib/active_record/connection_adapters/abstract_adapter.rb +165 -135
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +404 -424
- data/lib/active_record/connection_adapters/column.rb +26 -4
- data/lib/active_record/connection_adapters/connection_specification.rb +128 -118
- data/lib/active_record/connection_adapters/mysql/column.rb +6 -31
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +36 -49
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +22 -22
- data/lib/active_record/connection_adapters/mysql/quoting.rb +6 -12
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +16 -19
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -28
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +43 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +7 -6
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +23 -27
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +32 -53
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +19 -9
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +5 -3
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +16 -16
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +0 -10
- data/lib/active_record/connection_adapters/postgresql/oid/{rails_5_1_point.rb → legacy_point.rb} +9 -16
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +13 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +28 -8
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +32 -30
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -1
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +51 -51
- data/lib/active_record/connection_adapters/postgresql/oid.rb +22 -21
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +40 -35
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +37 -24
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +19 -23
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +182 -222
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +6 -4
- data/lib/active_record/connection_adapters/postgresql/utils.rb +7 -5
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +198 -167
- data/lib/active_record/connection_adapters/schema_cache.rb +16 -7
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +3 -3
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +1 -1
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +16 -19
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +1 -8
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +28 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +17 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +32 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +184 -167
- data/lib/active_record/connection_adapters/statement_pool.rb +7 -7
- data/lib/active_record/connection_handling.rb +14 -26
- data/lib/active_record/core.rb +109 -93
- data/lib/active_record/counter_cache.rb +60 -13
- data/lib/active_record/define_callbacks.rb +20 -0
- data/lib/active_record/dynamic_matchers.rb +80 -79
- data/lib/active_record/enum.rb +8 -6
- data/lib/active_record/errors.rb +64 -15
- data/lib/active_record/explain.rb +1 -2
- data/lib/active_record/explain_registry.rb +1 -1
- data/lib/active_record/explain_subscriber.rb +7 -4
- data/lib/active_record/fixture_set/file.rb +11 -8
- data/lib/active_record/fixtures.rb +66 -53
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/inheritance.rb +93 -79
- data/lib/active_record/integration.rb +7 -7
- data/lib/active_record/internal_metadata.rb +3 -16
- data/lib/active_record/legacy_yaml_adapter.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +69 -74
- data/lib/active_record/locking/pessimistic.rb +10 -1
- data/lib/active_record/log_subscriber.rb +23 -28
- data/lib/active_record/migration/command_recorder.rb +94 -94
- data/lib/active_record/migration/compatibility.rb +100 -47
- data/lib/active_record/migration/join_table.rb +6 -6
- data/lib/active_record/migration.rb +153 -155
- data/lib/active_record/model_schema.rb +94 -107
- data/lib/active_record/nested_attributes.rb +200 -199
- data/lib/active_record/null_relation.rb +11 -34
- data/lib/active_record/persistence.rb +65 -50
- data/lib/active_record/query_cache.rb +2 -6
- data/lib/active_record/querying.rb +3 -4
- data/lib/active_record/railtie.rb +16 -17
- data/lib/active_record/railties/controller_runtime.rb +6 -2
- data/lib/active_record/railties/databases.rake +105 -133
- data/lib/active_record/railties/jdbcmysql_error.rb +1 -1
- data/lib/active_record/readonly_attributes.rb +2 -2
- data/lib/active_record/reflection.rb +154 -108
- data/lib/active_record/relation/batches/batch_enumerator.rb +1 -1
- data/lib/active_record/relation/batches.rb +80 -51
- data/lib/active_record/relation/calculations.rb +169 -162
- data/lib/active_record/relation/delegation.rb +32 -31
- data/lib/active_record/relation/finder_methods.rb +197 -231
- data/lib/active_record/relation/merger.rb +58 -62
- data/lib/active_record/relation/predicate_builder/array_handler.rb +7 -5
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +23 -23
- data/lib/active_record/relation/predicate_builder/base_handler.rb +3 -1
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +0 -8
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +12 -10
- data/lib/active_record/relation/predicate_builder/range_handler.rb +0 -8
- data/lib/active_record/relation/predicate_builder.rb +92 -89
- data/lib/active_record/relation/query_attribute.rb +1 -1
- data/lib/active_record/relation/query_methods.rb +255 -293
- data/lib/active_record/relation/record_fetch_warning.rb +3 -3
- data/lib/active_record/relation/spawn_methods.rb +4 -5
- data/lib/active_record/relation/where_clause.rb +80 -65
- data/lib/active_record/relation/where_clause_factory.rb +47 -8
- data/lib/active_record/relation.rb +93 -119
- data/lib/active_record/result.rb +41 -32
- data/lib/active_record/runtime_registry.rb +3 -3
- data/lib/active_record/sanitization.rb +176 -192
- data/lib/active_record/schema.rb +3 -3
- data/lib/active_record/schema_dumper.rb +15 -38
- data/lib/active_record/schema_migration.rb +8 -4
- data/lib/active_record/scoping/default.rb +90 -90
- data/lib/active_record/scoping/named.rb +11 -11
- data/lib/active_record/scoping.rb +6 -6
- data/lib/active_record/secure_token.rb +2 -2
- data/lib/active_record/statement_cache.rb +13 -15
- data/lib/active_record/store.rb +31 -32
- data/lib/active_record/suppressor.rb +2 -1
- data/lib/active_record/table_metadata.rb +9 -5
- data/lib/active_record/tasks/database_tasks.rb +65 -55
- data/lib/active_record/tasks/mysql_database_tasks.rb +76 -73
- data/lib/active_record/tasks/postgresql_database_tasks.rb +72 -47
- data/lib/active_record/tasks/sqlite_database_tasks.rb +18 -16
- data/lib/active_record/timestamp.rb +46 -25
- data/lib/active_record/touch_later.rb +1 -2
- data/lib/active_record/transactions.rb +97 -109
- data/lib/active_record/type/adapter_specific_registry.rb +46 -42
- data/lib/active_record/type/decimal_without_scale.rb +13 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +3 -3
- data/lib/active_record/type/internal/abstract_json.rb +4 -0
- data/lib/active_record/type/serialized.rb +14 -8
- data/lib/active_record/type/text.rb +9 -0
- data/lib/active_record/type/time.rb +0 -1
- data/lib/active_record/type/type_map.rb +11 -15
- data/lib/active_record/type/unsigned_integer.rb +15 -0
- data/lib/active_record/type.rb +17 -13
- data/lib/active_record/type_caster/connection.rb +8 -6
- data/lib/active_record/type_caster/map.rb +3 -1
- data/lib/active_record/type_caster.rb +2 -2
- data/lib/active_record/validations/associated.rb +1 -1
- data/lib/active_record/validations/presence.rb +2 -2
- data/lib/active_record/validations/uniqueness.rb +8 -39
- data/lib/active_record/validations.rb +4 -4
- data/lib/active_record/version.rb +1 -1
- data/lib/active_record.rb +20 -20
- data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -34
- data/lib/rails/generators/active_record/migration.rb +1 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +9 -9
- data/lib/rails/generators/active_record.rb +4 -4
- metadata +24 -13
- data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_record"
|
2
2
|
|
3
3
|
db_namespace = namespace :db do
|
4
4
|
desc "Set the environment value for the database"
|
@@ -7,7 +7,7 @@ db_namespace = namespace :db do
|
|
7
7
|
ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment
|
8
8
|
end
|
9
9
|
|
10
|
-
task :
|
10
|
+
task check_protected_environments: [:environment, :load_config] do
|
11
11
|
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
|
12
12
|
end
|
13
13
|
|
@@ -17,24 +17,24 @@ db_namespace = namespace :db do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
namespace :create do
|
20
|
-
task :
|
20
|
+
task all: :load_config do
|
21
21
|
ActiveRecord::Tasks::DatabaseTasks.create_all
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
desc
|
26
|
-
task :
|
25
|
+
desc "Creates the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases."
|
26
|
+
task create: [:load_config] do
|
27
27
|
ActiveRecord::Tasks::DatabaseTasks.create_current
|
28
28
|
end
|
29
29
|
|
30
30
|
namespace :drop do
|
31
|
-
task :
|
31
|
+
task all: [:load_config, :check_protected_environments] do
|
32
32
|
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
desc
|
37
|
-
task :
|
36
|
+
desc "Drops the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases."
|
37
|
+
task drop: [:load_config, :check_protected_environments] do
|
38
38
|
db_namespace["drop:_unsafe"].invoke
|
39
39
|
end
|
40
40
|
|
@@ -43,20 +43,20 @@ db_namespace = namespace :db do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
namespace :purge do
|
46
|
-
task :
|
46
|
+
task all: [:load_config, :check_protected_environments] do
|
47
47
|
ActiveRecord::Tasks::DatabaseTasks.purge_all
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:purge:all to purge all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
|
52
|
-
task :
|
52
|
+
task purge: [:load_config, :check_protected_environments] do
|
53
53
|
ActiveRecord::Tasks::DatabaseTasks.purge_current
|
54
54
|
end
|
55
55
|
|
56
56
|
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
|
57
|
-
task :
|
57
|
+
task migrate: [:environment, :load_config] do
|
58
58
|
ActiveRecord::Tasks::DatabaseTasks.migrate
|
59
|
-
db_namespace[
|
59
|
+
db_namespace["_dump"].invoke
|
60
60
|
end
|
61
61
|
|
62
62
|
# IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
|
@@ -71,47 +71,47 @@ db_namespace = namespace :db do
|
|
71
71
|
end
|
72
72
|
# Allow this task to be called as many times as required. An example is the
|
73
73
|
# migrate:redo task, which calls other two internally that depend on this one.
|
74
|
-
db_namespace[
|
74
|
+
db_namespace["_dump"].reenable
|
75
75
|
end
|
76
76
|
|
77
77
|
namespace :migrate do
|
78
78
|
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
|
79
|
-
task :
|
79
|
+
task redo: [:environment, :load_config] do
|
80
80
|
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
|
81
81
|
|
82
|
-
if ENV[
|
83
|
-
db_namespace[
|
84
|
-
db_namespace[
|
82
|
+
if ENV["VERSION"]
|
83
|
+
db_namespace["migrate:down"].invoke
|
84
|
+
db_namespace["migrate:up"].invoke
|
85
85
|
else
|
86
|
-
db_namespace[
|
87
|
-
db_namespace[
|
86
|
+
db_namespace["rollback"].invoke
|
87
|
+
db_namespace["migrate"].invoke
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
# desc 'Resets your database using your migrations for the current environment'
|
92
|
-
task :
|
92
|
+
task reset: ["db:drop", "db:create", "db:migrate"]
|
93
93
|
|
94
94
|
# desc 'Runs the "up" for a given migration VERSION.'
|
95
|
-
task :
|
95
|
+
task up: [:environment, :load_config] do
|
96
96
|
raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
97
97
|
|
98
|
-
version = ENV[
|
98
|
+
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
99
99
|
ActiveRecord::Migrator.run(:up, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
|
100
|
-
db_namespace[
|
100
|
+
db_namespace["_dump"].invoke
|
101
101
|
end
|
102
102
|
|
103
103
|
# desc 'Runs the "down" for a given migration VERSION.'
|
104
|
-
task :
|
104
|
+
task down: [:environment, :load_config] do
|
105
105
|
raise "VERSION is required - To go down one migration, use db:rollback" if !ENV["VERSION"] || ENV["VERSION"].empty?
|
106
|
-
version = ENV[
|
106
|
+
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
|
107
107
|
ActiveRecord::Migrator.run(:down, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
|
108
|
-
db_namespace[
|
108
|
+
db_namespace["_dump"].invoke
|
109
109
|
end
|
110
110
|
|
111
|
-
desc
|
112
|
-
task :
|
111
|
+
desc "Display status of migrations"
|
112
|
+
task status: [:environment, :load_config] do
|
113
113
|
unless ActiveRecord::SchemaMigration.table_exists?
|
114
|
-
abort
|
114
|
+
abort "Schema migrations table does not exist yet."
|
115
115
|
end
|
116
116
|
|
117
117
|
# output
|
@@ -126,93 +126,93 @@ db_namespace = namespace :db do
|
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
-
desc
|
130
|
-
task :
|
131
|
-
step = ENV[
|
129
|
+
desc "Rolls the schema back to the previous version (specify steps w/ STEP=n)."
|
130
|
+
task rollback: [:environment, :load_config] do
|
131
|
+
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
132
132
|
ActiveRecord::Migrator.rollback(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
|
133
|
-
db_namespace[
|
133
|
+
db_namespace["_dump"].invoke
|
134
134
|
end
|
135
135
|
|
136
136
|
# desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
|
137
|
-
task :
|
138
|
-
step = ENV[
|
137
|
+
task forward: [:environment, :load_config] do
|
138
|
+
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
139
139
|
ActiveRecord::Migrator.forward(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
|
140
|
-
db_namespace[
|
140
|
+
db_namespace["_dump"].invoke
|
141
141
|
end
|
142
142
|
|
143
143
|
# desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
|
144
|
-
task :
|
144
|
+
task reset: [ "db:drop", "db:setup" ]
|
145
145
|
|
146
146
|
# desc "Retrieves the charset for the current environment's database"
|
147
|
-
task :
|
147
|
+
task charset: [:environment, :load_config] do
|
148
148
|
puts ActiveRecord::Tasks::DatabaseTasks.charset_current
|
149
149
|
end
|
150
150
|
|
151
151
|
# desc "Retrieves the collation for the current environment's database"
|
152
|
-
task :
|
152
|
+
task collation: [:environment, :load_config] do
|
153
153
|
begin
|
154
154
|
puts ActiveRecord::Tasks::DatabaseTasks.collation_current
|
155
155
|
rescue NoMethodError
|
156
|
-
$stderr.puts
|
156
|
+
$stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
160
|
-
desc
|
161
|
-
task :
|
160
|
+
desc "Retrieves the current schema version number"
|
161
|
+
task version: [:environment, :load_config] do
|
162
162
|
puts "Current version: #{ActiveRecord::Migrator.current_version}"
|
163
163
|
end
|
164
164
|
|
165
165
|
# desc "Raises an error if there are pending migrations"
|
166
|
-
task :
|
166
|
+
task abort_if_pending_migrations: [:environment, :load_config] do
|
167
167
|
pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Tasks::DatabaseTasks.migrations_paths).pending_migrations
|
168
168
|
|
169
169
|
if pending_migrations.any?
|
170
170
|
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
171
171
|
pending_migrations.each do |pending_migration|
|
172
|
-
puts
|
172
|
+
puts " %4d %s" % [pending_migration.version, pending_migration.name]
|
173
173
|
end
|
174
174
|
abort %{Run `rails db:migrate` to update your database then try again.}
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
178
|
-
desc
|
179
|
-
task :
|
178
|
+
desc "Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)"
|
179
|
+
task setup: ["db:schema:load_if_ruby", "db:structure:load_if_sql", :seed]
|
180
180
|
|
181
|
-
desc
|
181
|
+
desc "Loads the seed data from db/seeds.rb"
|
182
182
|
task :seed do
|
183
|
-
db_namespace[
|
183
|
+
db_namespace["abort_if_pending_migrations"].invoke
|
184
184
|
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
185
185
|
end
|
186
186
|
|
187
187
|
namespace :fixtures do
|
188
188
|
desc "Loads fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y. Load from subdirectory in test/fixtures using FIXTURES_DIR=z. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
|
189
|
-
task :
|
190
|
-
require
|
189
|
+
task load: [:environment, :load_config] do
|
190
|
+
require "active_record/fixtures"
|
191
191
|
|
192
192
|
base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
|
193
193
|
|
194
|
-
fixtures_dir = if ENV[
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
194
|
+
fixtures_dir = if ENV["FIXTURES_DIR"]
|
195
|
+
File.join base_dir, ENV["FIXTURES_DIR"]
|
196
|
+
else
|
197
|
+
base_dir
|
198
|
+
end
|
199
199
|
|
200
|
-
fixture_files = if ENV[
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
200
|
+
fixture_files = if ENV["FIXTURES"]
|
201
|
+
ENV["FIXTURES"].split(",")
|
202
|
+
else
|
203
|
+
# The use of String#[] here is to support namespaced fixtures.
|
204
|
+
Dir["#{fixtures_dir}/**/*.yml"].map { |f| f[(fixtures_dir.size + 1)..-5] }
|
205
|
+
end
|
206
206
|
|
207
207
|
ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
|
208
208
|
end
|
209
209
|
|
210
210
|
# desc "Search for a fixture given a LABEL or ID. Specify an alternative path (eg. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
|
211
|
-
task :
|
212
|
-
require
|
211
|
+
task identify: [:environment, :load_config] do
|
212
|
+
require "active_record/fixtures"
|
213
213
|
|
214
|
-
label, id = ENV[
|
215
|
-
raise
|
214
|
+
label, id = ENV["LABEL"], ENV["ID"]
|
215
|
+
raise "LABEL or ID required" if label.blank? && id.blank?
|
216
216
|
|
217
217
|
puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
|
218
218
|
|
@@ -233,39 +233,36 @@ db_namespace = namespace :db do
|
|
233
233
|
end
|
234
234
|
|
235
235
|
namespace :schema do
|
236
|
-
desc
|
237
|
-
task :
|
238
|
-
require
|
239
|
-
filename = ENV[
|
236
|
+
desc "Creates a db/schema.rb file that is portable against any DB supported by Active Record"
|
237
|
+
task dump: [:environment, :load_config] do
|
238
|
+
require "active_record/schema_dumper"
|
239
|
+
filename = ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema.rb")
|
240
240
|
File.open(filename, "w:utf-8") do |file|
|
241
241
|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
|
242
242
|
end
|
243
|
-
db_namespace[
|
243
|
+
db_namespace["schema:dump"].reenable
|
244
244
|
end
|
245
245
|
|
246
|
-
desc
|
247
|
-
task :
|
248
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV[
|
246
|
+
desc "Loads a schema.rb file into the database"
|
247
|
+
task load: [:environment, :load_config, :check_protected_environments] do
|
248
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV["SCHEMA"])
|
249
249
|
end
|
250
250
|
|
251
|
-
task :
|
251
|
+
task load_if_ruby: ["db:create", :environment] do
|
252
252
|
db_namespace["schema:load"].invoke if ActiveRecord::Base.schema_format == :ruby
|
253
253
|
end
|
254
254
|
|
255
255
|
namespace :cache do
|
256
|
-
desc
|
257
|
-
task :
|
258
|
-
|
259
|
-
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.
|
260
|
-
|
261
|
-
con.schema_cache.clear!
|
262
|
-
con.data_sources.each { |table| con.schema_cache.add(table) }
|
263
|
-
open(filename, 'wb') { |f| f.write(Marshal.dump(con.schema_cache)) }
|
256
|
+
desc "Creates a db/schema_cache.yml file."
|
257
|
+
task dump: [:environment, :load_config] do
|
258
|
+
conn = ActiveRecord::Base.connection
|
259
|
+
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.yml")
|
260
|
+
ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(conn, filename)
|
264
261
|
end
|
265
262
|
|
266
|
-
desc
|
267
|
-
task :
|
268
|
-
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.
|
263
|
+
desc "Clears a db/schema_cache.yml file."
|
264
|
+
task clear: [:environment, :load_config] do
|
265
|
+
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.yml")
|
269
266
|
rm_f filename, verbose: false
|
270
267
|
end
|
271
268
|
end
|
@@ -273,53 +270,44 @@ db_namespace = namespace :db do
|
|
273
270
|
end
|
274
271
|
|
275
272
|
namespace :structure do
|
276
|
-
desc
|
277
|
-
task :
|
278
|
-
filename = ENV[
|
273
|
+
desc "Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql"
|
274
|
+
task dump: [:environment, :load_config] do
|
275
|
+
filename = ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
|
279
276
|
current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
|
280
277
|
ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
|
281
278
|
|
282
|
-
if ActiveRecord::
|
283
|
-
ActiveRecord::SchemaMigration.table_exists?
|
279
|
+
if ActiveRecord::SchemaMigration.table_exists?
|
284
280
|
File.open(filename, "a") do |f|
|
285
281
|
f.puts ActiveRecord::Base.connection.dump_schema_information
|
286
282
|
f.print "\n"
|
287
283
|
end
|
288
284
|
end
|
289
|
-
db_namespace[
|
285
|
+
db_namespace["structure:dump"].reenable
|
290
286
|
end
|
291
287
|
|
292
288
|
desc "Recreates the databases from the structure.sql file"
|
293
|
-
task :
|
294
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV[
|
289
|
+
task load: [:environment, :load_config, :check_protected_environments] do
|
290
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV["SCHEMA"])
|
295
291
|
end
|
296
292
|
|
297
|
-
task :
|
293
|
+
task load_if_sql: ["db:create", :environment] do
|
298
294
|
db_namespace["structure:load"].invoke if ActiveRecord::Base.schema_format == :sql
|
299
295
|
end
|
300
296
|
end
|
301
297
|
|
302
298
|
namespace :test do
|
303
|
-
|
304
|
-
task :deprecated do
|
305
|
-
Rake.application.top_level_tasks.grep(/^db:test:/).each do |task|
|
306
|
-
$stderr.puts "WARNING: #{task} is deprecated. The Rails test helper now maintains " \
|
307
|
-
"your test schema automatically, see the release notes for details."
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
299
|
# desc "Recreate the test database from the current schema"
|
312
|
-
task :
|
300
|
+
task load: %w(db:test:purge) do
|
313
301
|
case ActiveRecord::Base.schema_format
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
302
|
+
when :ruby
|
303
|
+
db_namespace["test:load_schema"].invoke
|
304
|
+
when :sql
|
305
|
+
db_namespace["test:load_structure"].invoke
|
318
306
|
end
|
319
307
|
end
|
320
308
|
|
321
309
|
# desc "Recreate the test database from an existent schema.rb file"
|
322
|
-
task :
|
310
|
+
task load_schema: %w(db:test:purge) do
|
323
311
|
begin
|
324
312
|
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
|
325
313
|
ActiveRecord::Schema.verbose = false
|
@@ -332,35 +320,19 @@ db_namespace = namespace :db do
|
|
332
320
|
end
|
333
321
|
|
334
322
|
# desc "Recreate the test database from an existent structure.sql file"
|
335
|
-
task :
|
323
|
+
task load_structure: %w(db:test:purge) do
|
336
324
|
ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations["test"], :sql, ENV["SCHEMA"], "test"
|
337
325
|
end
|
338
326
|
|
339
|
-
# desc "Recreate the test database from a fresh schema"
|
340
|
-
task :clone => %w(db:test:deprecated environment) do
|
341
|
-
case ActiveRecord::Base.schema_format
|
342
|
-
when :ruby
|
343
|
-
db_namespace["test:clone_schema"].invoke
|
344
|
-
when :sql
|
345
|
-
db_namespace["test:clone_structure"].invoke
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
|
-
# desc "Recreate the test database from a fresh schema.rb file"
|
350
|
-
task :clone_schema => %w(db:test:deprecated db:schema:dump db:test:load_schema)
|
351
|
-
|
352
|
-
# desc "Recreate the test database from a fresh structure.sql file"
|
353
|
-
task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
|
354
|
-
|
355
327
|
# desc "Empty the test database"
|
356
|
-
task :
|
357
|
-
ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations[
|
328
|
+
task purge: %w(environment load_config check_protected_environments) do
|
329
|
+
ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations["test"]
|
358
330
|
end
|
359
331
|
|
360
332
|
# desc 'Load the test schema'
|
361
|
-
task :
|
333
|
+
task prepare: %w(environment load_config) do
|
362
334
|
unless ActiveRecord::Base.configurations.blank?
|
363
|
-
db_namespace[
|
335
|
+
db_namespace["test:load"].invoke
|
364
336
|
end
|
365
337
|
end
|
366
338
|
end
|
@@ -369,13 +341,13 @@ end
|
|
369
341
|
namespace :railties do
|
370
342
|
namespace :install do
|
371
343
|
# desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
|
372
|
-
task :
|
373
|
-
to_load = ENV[
|
344
|
+
task migrations: :'db:load_config' do
|
345
|
+
to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)
|
374
346
|
railties = {}
|
375
347
|
Rails.application.migration_railties.each do |railtie|
|
376
348
|
next unless to_load == :all || to_load.include?(railtie.railtie_name)
|
377
349
|
|
378
|
-
if railtie.respond_to?(:paths) && (path = railtie.paths[
|
350
|
+
if railtie.respond_to?(:paths) && (path = railtie.paths["db/migrate"].first)
|
379
351
|
railties[railtie.railtie_name] = path
|
380
352
|
end
|
381
353
|
end
|
@@ -389,7 +361,7 @@ namespace :railties do
|
|
389
361
|
end
|
390
362
|
|
391
363
|
ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
|
392
|
-
:
|
364
|
+
on_skip: on_skip, on_copy: on_copy)
|
393
365
|
end
|
394
366
|
end
|
395
367
|
end
|
@@ -11,12 +11,12 @@ module ActiveRecord
|
|
11
11
|
# Attributes listed as readonly will be used to create a new record but update operations will
|
12
12
|
# ignore these fields.
|
13
13
|
def attr_readonly(*attributes)
|
14
|
-
self._attr_readonly = Set.new(attributes.map(&:to_s)) + (
|
14
|
+
self._attr_readonly = Set.new(attributes.map(&:to_s)) + (_attr_readonly || [])
|
15
15
|
end
|
16
16
|
|
17
17
|
# Returns an array of all the attributes that have been specified as readonly.
|
18
18
|
def readonly_attributes
|
19
|
-
|
19
|
+
_attr_readonly
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|