activerecord 4.2.0 → 5.0.0
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 +1537 -789
- data/MIT-LICENSE +2 -2
- data/README.rdoc +7 -8
- data/examples/performance.rb +2 -3
- data/examples/simple.rb +0 -1
- data/lib/active_record/aggregations.rb +37 -23
- data/lib/active_record/association_relation.rb +16 -3
- data/lib/active_record/associations/alias_tracker.rb +19 -16
- data/lib/active_record/associations/association.rb +23 -9
- data/lib/active_record/associations/association_scope.rb +74 -102
- data/lib/active_record/associations/belongs_to_association.rb +26 -29
- data/lib/active_record/associations/builder/association.rb +28 -34
- data/lib/active_record/associations/builder/belongs_to.rb +43 -18
- data/lib/active_record/associations/builder/collection_association.rb +12 -20
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +22 -15
- data/lib/active_record/associations/builder/has_many.rb +4 -4
- data/lib/active_record/associations/builder/has_one.rb +11 -6
- data/lib/active_record/associations/builder/singular_association.rb +3 -10
- data/lib/active_record/associations/collection_association.rb +61 -33
- data/lib/active_record/associations/collection_proxy.rb +81 -35
- data/lib/active_record/associations/foreign_association.rb +11 -0
- data/lib/active_record/associations/has_many_association.rb +21 -57
- data/lib/active_record/associations/has_many_through_association.rb +15 -45
- data/lib/active_record/associations/has_one_association.rb +13 -5
- data/lib/active_record/associations/join_dependency/join_association.rb +20 -8
- data/lib/active_record/associations/join_dependency.rb +37 -21
- data/lib/active_record/associations/preloader/association.rb +51 -53
- data/lib/active_record/associations/preloader/collection_association.rb +0 -6
- data/lib/active_record/associations/preloader/has_many_through.rb +1 -1
- data/lib/active_record/associations/preloader/has_one.rb +0 -8
- data/lib/active_record/associations/preloader/through_association.rb +27 -14
- data/lib/active_record/associations/preloader.rb +18 -8
- data/lib/active_record/associations/singular_association.rb +8 -8
- data/lib/active_record/associations/through_association.rb +22 -9
- data/lib/active_record/associations.rb +321 -212
- data/lib/active_record/attribute/user_provided_default.rb +28 -0
- data/lib/active_record/attribute.rb +79 -15
- data/lib/active_record/attribute_assignment.rb +20 -141
- data/lib/active_record/attribute_decorators.rb +6 -5
- data/lib/active_record/attribute_methods/before_type_cast.rb +6 -1
- data/lib/active_record/attribute_methods/dirty.rb +51 -81
- data/lib/active_record/attribute_methods/primary_key.rb +2 -2
- data/lib/active_record/attribute_methods/query.rb +2 -2
- data/lib/active_record/attribute_methods/read.rb +31 -59
- data/lib/active_record/attribute_methods/serialization.rb +13 -16
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -14
- data/lib/active_record/attribute_methods/write.rb +14 -38
- data/lib/active_record/attribute_methods.rb +70 -45
- data/lib/active_record/attribute_mutation_tracker.rb +70 -0
- data/lib/active_record/attribute_set/builder.rb +37 -15
- data/lib/active_record/attribute_set.rb +34 -3
- data/lib/active_record/attributes.rb +199 -73
- data/lib/active_record/autosave_association.rb +73 -25
- data/lib/active_record/base.rb +35 -27
- data/lib/active_record/callbacks.rb +39 -43
- data/lib/active_record/coders/json.rb +1 -1
- data/lib/active_record/coders/yaml_column.rb +20 -8
- data/lib/active_record/collection_cache_key.rb +40 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +457 -181
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +83 -59
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/quoting.rb +74 -9
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +4 -4
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +61 -39
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +246 -185
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +72 -17
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +438 -136
- data/lib/active_record/connection_adapters/abstract/transaction.rb +53 -40
- data/lib/active_record/connection_adapters/abstract_adapter.rb +166 -66
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +429 -335
- data/lib/active_record/connection_adapters/column.rb +28 -43
- data/lib/active_record/connection_adapters/connection_specification.rb +15 -27
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +22 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +50 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +125 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +70 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +51 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +67 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +93 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +26 -177
- data/lib/active_record/connection_adapters/postgresql/column.rb +5 -10
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +11 -73
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +27 -56
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -1
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +7 -13
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +3 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +3 -3
- data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -26
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +0 -4
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +4 -4
- data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +50 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +31 -17
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +17 -5
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid.rb +1 -6
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +26 -18
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +29 -10
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +107 -79
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +47 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +248 -154
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +35 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +258 -170
- data/lib/active_record/connection_adapters/schema_cache.rb +36 -23
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +32 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +19 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +48 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +22 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +150 -209
- data/lib/active_record/connection_adapters/statement_pool.rb +31 -12
- data/lib/active_record/connection_handling.rb +38 -15
- data/lib/active_record/core.rb +109 -114
- data/lib/active_record/counter_cache.rb +14 -25
- data/lib/active_record/dynamic_matchers.rb +1 -20
- data/lib/active_record/enum.rb +115 -79
- data/lib/active_record/errors.rb +88 -48
- data/lib/active_record/explain_registry.rb +1 -1
- data/lib/active_record/explain_subscriber.rb +2 -2
- data/lib/active_record/fixture_set/file.rb +26 -5
- data/lib/active_record/fixtures.rb +84 -46
- data/lib/active_record/gem_version.rb +2 -2
- data/lib/active_record/inheritance.rb +32 -40
- data/lib/active_record/integration.rb +4 -4
- data/lib/active_record/internal_metadata.rb +56 -0
- data/lib/active_record/legacy_yaml_adapter.rb +46 -0
- data/lib/active_record/locale/en.yml +3 -2
- data/lib/active_record/locking/optimistic.rb +27 -25
- data/lib/active_record/locking/pessimistic.rb +1 -1
- data/lib/active_record/log_subscriber.rb +43 -21
- data/lib/active_record/migration/command_recorder.rb +59 -18
- data/lib/active_record/migration/compatibility.rb +126 -0
- data/lib/active_record/migration.rb +372 -114
- data/lib/active_record/model_schema.rb +128 -38
- data/lib/active_record/nested_attributes.rb +71 -32
- data/lib/active_record/no_touching.rb +1 -1
- data/lib/active_record/null_relation.rb +16 -8
- data/lib/active_record/persistence.rb +124 -80
- data/lib/active_record/query_cache.rb +15 -18
- data/lib/active_record/querying.rb +10 -9
- data/lib/active_record/railtie.rb +28 -19
- data/lib/active_record/railties/controller_runtime.rb +1 -1
- data/lib/active_record/railties/databases.rake +67 -51
- data/lib/active_record/readonly_attributes.rb +1 -1
- data/lib/active_record/reflection.rb +318 -139
- data/lib/active_record/relation/batches/batch_enumerator.rb +67 -0
- data/lib/active_record/relation/batches.rb +139 -34
- data/lib/active_record/relation/calculations.rb +80 -102
- data/lib/active_record/relation/delegation.rb +7 -20
- data/lib/active_record/relation/finder_methods.rb +167 -97
- data/lib/active_record/relation/from_clause.rb +32 -0
- data/lib/active_record/relation/merger.rb +38 -41
- data/lib/active_record/relation/predicate_builder/array_handler.rb +12 -16
- data/lib/active_record/relation/predicate_builder/association_query_handler.rb +88 -0
- data/lib/active_record/relation/predicate_builder/base_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +17 -0
- data/lib/active_record/relation/predicate_builder/class_handler.rb +27 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +57 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +33 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +1 -1
- data/lib/active_record/relation/predicate_builder.rb +124 -82
- data/lib/active_record/relation/query_attribute.rb +19 -0
- data/lib/active_record/relation/query_methods.rb +323 -257
- data/lib/active_record/relation/record_fetch_warning.rb +49 -0
- data/lib/active_record/relation/spawn_methods.rb +11 -10
- data/lib/active_record/relation/where_clause.rb +174 -0
- data/lib/active_record/relation/where_clause_factory.rb +38 -0
- data/lib/active_record/relation.rb +176 -115
- data/lib/active_record/result.rb +4 -3
- data/lib/active_record/runtime_registry.rb +1 -1
- data/lib/active_record/sanitization.rb +95 -66
- data/lib/active_record/schema.rb +26 -22
- data/lib/active_record/schema_dumper.rb +62 -38
- data/lib/active_record/schema_migration.rb +11 -17
- data/lib/active_record/scoping/default.rb +24 -9
- data/lib/active_record/scoping/named.rb +49 -28
- data/lib/active_record/scoping.rb +32 -15
- data/lib/active_record/secure_token.rb +38 -0
- data/lib/active_record/serialization.rb +2 -4
- data/lib/active_record/statement_cache.rb +16 -14
- data/lib/active_record/store.rb +8 -3
- data/lib/active_record/suppressor.rb +58 -0
- data/lib/active_record/table_metadata.rb +68 -0
- data/lib/active_record/tasks/database_tasks.rb +59 -42
- data/lib/active_record/tasks/mysql_database_tasks.rb +32 -26
- data/lib/active_record/tasks/postgresql_database_tasks.rb +29 -9
- data/lib/active_record/tasks/sqlite_database_tasks.rb +5 -1
- data/lib/active_record/timestamp.rb +20 -9
- data/lib/active_record/touch_later.rb +58 -0
- data/lib/active_record/transactions.rb +159 -67
- data/lib/active_record/type/adapter_specific_registry.rb +130 -0
- data/lib/active_record/type/date.rb +2 -41
- data/lib/active_record/type/date_time.rb +2 -38
- data/lib/active_record/type/hash_lookup_type_map.rb +8 -2
- data/lib/active_record/type/internal/abstract_json.rb +29 -0
- data/lib/active_record/type/internal/timezone.rb +15 -0
- data/lib/active_record/type/serialized.rb +21 -14
- data/lib/active_record/type/time.rb +10 -16
- data/lib/active_record/type/type_map.rb +4 -4
- data/lib/active_record/type.rb +66 -17
- data/lib/active_record/type_caster/connection.rb +29 -0
- data/lib/active_record/type_caster/map.rb +19 -0
- data/lib/active_record/type_caster.rb +7 -0
- data/lib/active_record/validations/absence.rb +23 -0
- data/lib/active_record/validations/associated.rb +10 -3
- data/lib/active_record/validations/length.rb +24 -0
- data/lib/active_record/validations/presence.rb +11 -12
- data/lib/active_record/validations/uniqueness.rb +29 -18
- data/lib/active_record/validations.rb +33 -32
- data/lib/active_record.rb +9 -2
- data/lib/rails/generators/active_record/migration/migration_generator.rb +7 -4
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +8 -6
- data/lib/rails/generators/active_record/migration/templates/migration.rb +8 -7
- data/lib/rails/generators/active_record/migration.rb +7 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +32 -15
- data/lib/rails/generators/active_record/model/templates/application_record.rb +5 -0
- data/lib/rails/generators/active_record/model/templates/model.rb +3 -0
- metadata +60 -34
- data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
- data/lib/active_record/connection_adapters/postgresql/oid/infinity.rb +0 -13
- data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
- data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
- data/lib/active_record/serializers/xml_serializer.rb +0 -193
- data/lib/active_record/type/big_integer.rb +0 -13
- data/lib/active_record/type/binary.rb +0 -50
- data/lib/active_record/type/boolean.rb +0 -30
- data/lib/active_record/type/decimal.rb +0 -40
- data/lib/active_record/type/decimal_without_scale.rb +0 -11
- data/lib/active_record/type/decorator.rb +0 -14
- data/lib/active_record/type/float.rb +0 -19
- data/lib/active_record/type/integer.rb +0 -55
- data/lib/active_record/type/mutable.rb +0 -16
- data/lib/active_record/type/numeric.rb +0 -36
- data/lib/active_record/type/string.rb +0 -36
- data/lib/active_record/type/text.rb +0 -11
- data/lib/active_record/type/time_value.rb +0 -38
- data/lib/active_record/type/unsigned_integer.rb +0 -15
- data/lib/active_record/type/value.rb +0 -101
@@ -1,6 +1,16 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
|
3
3
|
db_namespace = namespace :db do
|
4
|
+
desc "Set the environment value for the database"
|
5
|
+
task "environment:set" => [:environment, :load_config] do
|
6
|
+
ActiveRecord::InternalMetadata.create_table
|
7
|
+
ActiveRecord::InternalMetadata[:environment] = ActiveRecord::Migrator.current_environment
|
8
|
+
end
|
9
|
+
|
10
|
+
task :check_protected_environments => [:environment, :load_config] do
|
11
|
+
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
|
12
|
+
end
|
13
|
+
|
4
14
|
task :load_config do
|
5
15
|
ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration || {}
|
6
16
|
ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
|
@@ -12,45 +22,52 @@ db_namespace = namespace :db do
|
|
12
22
|
end
|
13
23
|
end
|
14
24
|
|
15
|
-
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 it defaults to creating the development and test databases.'
|
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.'
|
16
26
|
task :create => [:load_config] do
|
17
27
|
ActiveRecord::Tasks::DatabaseTasks.create_current
|
18
28
|
end
|
19
29
|
|
20
30
|
namespace :drop do
|
21
|
-
task :all => :load_config do
|
31
|
+
task :all => [:load_config, :check_protected_environments] do
|
22
32
|
ActiveRecord::Tasks::DatabaseTasks.drop_all
|
23
33
|
end
|
24
34
|
end
|
25
35
|
|
26
|
-
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 it defaults to dropping the development and test databases.'
|
27
|
-
task :drop => [:load_config] do
|
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
|
+
db_namespace["drop:_unsafe"].invoke
|
39
|
+
end
|
40
|
+
|
41
|
+
task "drop:_unsafe" => [:load_config] do
|
28
42
|
ActiveRecord::Tasks::DatabaseTasks.drop_current
|
29
43
|
end
|
30
44
|
|
31
45
|
namespace :purge do
|
32
|
-
task :all => :load_config do
|
46
|
+
task :all => [:load_config, :check_protected_environments] do
|
33
47
|
ActiveRecord::Tasks::DatabaseTasks.purge_all
|
34
48
|
end
|
35
49
|
end
|
36
50
|
|
37
|
-
# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:
|
38
|
-
task :purge => [:load_config] do
|
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 :purge => [:load_config, :check_protected_environments] do
|
39
53
|
ActiveRecord::Tasks::DatabaseTasks.purge_current
|
40
54
|
end
|
41
55
|
|
42
56
|
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
|
43
57
|
task :migrate => [:environment, :load_config] do
|
44
58
|
ActiveRecord::Tasks::DatabaseTasks.migrate
|
45
|
-
db_namespace['_dump'].invoke
|
59
|
+
db_namespace['_dump'].invoke
|
46
60
|
end
|
47
61
|
|
62
|
+
# IMPORTANT: This task won't dump the schema if ActiveRecord::Base.dump_schema_after_migration is set to false
|
48
63
|
task :_dump do
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
64
|
+
if ActiveRecord::Base.dump_schema_after_migration
|
65
|
+
case ActiveRecord::Base.schema_format
|
66
|
+
when :ruby then db_namespace["schema:dump"].invoke
|
67
|
+
when :sql then db_namespace["structure:dump"].invoke
|
68
|
+
else
|
69
|
+
raise "unknown schema format #{ActiveRecord::Base.schema_format}"
|
70
|
+
end
|
54
71
|
end
|
55
72
|
# Allow this task to be called as many times as required. An example is the
|
56
73
|
# migrate:redo task, which calls other two internally that depend on this one.
|
@@ -76,7 +93,7 @@ db_namespace = namespace :db do
|
|
76
93
|
task :up => [:environment, :load_config] do
|
77
94
|
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
78
95
|
raise 'VERSION is required' unless version
|
79
|
-
ActiveRecord::Migrator.run(:up, ActiveRecord::
|
96
|
+
ActiveRecord::Migrator.run(:up, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
|
80
97
|
db_namespace['_dump'].invoke
|
81
98
|
end
|
82
99
|
|
@@ -84,7 +101,7 @@ db_namespace = namespace :db do
|
|
84
101
|
task :down => [:environment, :load_config] do
|
85
102
|
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
|
86
103
|
raise 'VERSION is required - To go down one migration, run db:rollback' unless version
|
87
|
-
ActiveRecord::Migrator.run(:down, ActiveRecord::
|
104
|
+
ActiveRecord::Migrator.run(:down, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
|
88
105
|
db_namespace['_dump'].invoke
|
89
106
|
end
|
90
107
|
|
@@ -96,13 +113,15 @@ db_namespace = namespace :db do
|
|
96
113
|
db_list = ActiveRecord::SchemaMigration.normalized_versions
|
97
114
|
|
98
115
|
file_list =
|
99
|
-
ActiveRecord::
|
100
|
-
|
101
|
-
|
102
|
-
|
116
|
+
ActiveRecord::Tasks::DatabaseTasks.migrations_paths.flat_map do |path|
|
117
|
+
Dir.foreach(path).map do |file|
|
118
|
+
next unless ActiveRecord::Migrator.match_to_migration_filename?(file)
|
119
|
+
|
120
|
+
version, name, scope = ActiveRecord::Migrator.parse_migration_filename(file)
|
121
|
+
version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
|
103
122
|
status = db_list.delete(version) ? 'up' : 'down'
|
104
|
-
[status, version,
|
105
|
-
end
|
123
|
+
[status, version, (name + scope).humanize]
|
124
|
+
end.compact
|
106
125
|
end
|
107
126
|
|
108
127
|
db_list.map! do |version|
|
@@ -122,22 +141,19 @@ db_namespace = namespace :db do
|
|
122
141
|
desc 'Rolls the schema back to the previous version (specify steps w/ STEP=n).'
|
123
142
|
task :rollback => [:environment, :load_config] do
|
124
143
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
125
|
-
ActiveRecord::Migrator.rollback(ActiveRecord::
|
144
|
+
ActiveRecord::Migrator.rollback(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
|
126
145
|
db_namespace['_dump'].invoke
|
127
146
|
end
|
128
147
|
|
129
148
|
# desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
|
130
149
|
task :forward => [:environment, :load_config] do
|
131
150
|
step = ENV['STEP'] ? ENV['STEP'].to_i : 1
|
132
|
-
ActiveRecord::Migrator.forward(ActiveRecord::
|
151
|
+
ActiveRecord::Migrator.forward(ActiveRecord::Tasks::DatabaseTasks.migrations_paths, step)
|
133
152
|
db_namespace['_dump'].invoke
|
134
153
|
end
|
135
154
|
|
136
155
|
# desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
|
137
|
-
task :reset => [:
|
138
|
-
db_namespace["drop"].invoke
|
139
|
-
db_namespace["setup"].invoke
|
140
|
-
end
|
156
|
+
task :reset => [ 'db:drop', 'db:setup' ]
|
141
157
|
|
142
158
|
# desc "Retrieves the charset for the current environment's database"
|
143
159
|
task :charset => [:environment, :load_config] do
|
@@ -159,29 +175,29 @@ db_namespace = namespace :db do
|
|
159
175
|
end
|
160
176
|
|
161
177
|
# desc "Raises an error if there are pending migrations"
|
162
|
-
task :abort_if_pending_migrations => :environment do
|
163
|
-
pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::
|
178
|
+
task :abort_if_pending_migrations => [:environment, :load_config] do
|
179
|
+
pending_migrations = ActiveRecord::Migrator.open(ActiveRecord::Tasks::DatabaseTasks.migrations_paths).pending_migrations
|
164
180
|
|
165
181
|
if pending_migrations.any?
|
166
182
|
puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
|
167
183
|
pending_migrations.each do |pending_migration|
|
168
184
|
puts ' %4d %s' % [pending_migration.version, pending_migration.name]
|
169
185
|
end
|
170
|
-
abort %{Run `
|
186
|
+
abort %{Run `rails db:migrate` to update your database then try again.}
|
171
187
|
end
|
172
188
|
end
|
173
189
|
|
174
|
-
desc '
|
190
|
+
desc 'Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)'
|
175
191
|
task :setup => ['db:schema:load_if_ruby', 'db:structure:load_if_sql', :seed]
|
176
192
|
|
177
|
-
desc '
|
193
|
+
desc 'Loads the seed data from db/seeds.rb'
|
178
194
|
task :seed do
|
179
195
|
db_namespace['abort_if_pending_migrations'].invoke
|
180
196
|
ActiveRecord::Tasks::DatabaseTasks.load_seed
|
181
197
|
end
|
182
198
|
|
183
199
|
namespace :fixtures do
|
184
|
-
desc "
|
200
|
+
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."
|
185
201
|
task :load => [:environment, :load_config] do
|
186
202
|
require 'active_record/fixtures'
|
187
203
|
|
@@ -229,7 +245,7 @@ db_namespace = namespace :db do
|
|
229
245
|
end
|
230
246
|
|
231
247
|
namespace :schema do
|
232
|
-
desc '
|
248
|
+
desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
|
233
249
|
task :dump => [:environment, :load_config] do
|
234
250
|
require 'active_record/schema_dumper'
|
235
251
|
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
|
@@ -239,8 +255,8 @@ db_namespace = namespace :db do
|
|
239
255
|
db_namespace['schema:dump'].reenable
|
240
256
|
end
|
241
257
|
|
242
|
-
desc '
|
243
|
-
task :load => [:environment, :load_config] do
|
258
|
+
desc 'Loads a schema.rb file into the database'
|
259
|
+
task :load => [:environment, :load_config, :check_protected_environments] do
|
244
260
|
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
|
245
261
|
end
|
246
262
|
|
@@ -249,29 +265,29 @@ db_namespace = namespace :db do
|
|
249
265
|
end
|
250
266
|
|
251
267
|
namespace :cache do
|
252
|
-
desc '
|
268
|
+
desc 'Creates a db/schema_cache.dump file.'
|
253
269
|
task :dump => [:environment, :load_config] do
|
254
270
|
con = ActiveRecord::Base.connection
|
255
271
|
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
|
256
272
|
|
257
273
|
con.schema_cache.clear!
|
258
|
-
con.
|
274
|
+
con.data_sources.each { |table| con.schema_cache.add(table) }
|
259
275
|
open(filename, 'wb') { |f| f.write(Marshal.dump(con.schema_cache)) }
|
260
276
|
end
|
261
277
|
|
262
|
-
desc '
|
278
|
+
desc 'Clears a db/schema_cache.dump file.'
|
263
279
|
task :clear => [:environment, :load_config] do
|
264
280
|
filename = File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "schema_cache.dump")
|
265
|
-
|
281
|
+
rm_f filename, verbose: false
|
266
282
|
end
|
267
283
|
end
|
268
284
|
|
269
285
|
end
|
270
286
|
|
271
287
|
namespace :structure do
|
272
|
-
desc '
|
288
|
+
desc 'Dumps the database structure to db/structure.sql. Specify another file with SCHEMA=db/my_structure.sql'
|
273
289
|
task :dump => [:environment, :load_config] do
|
274
|
-
filename = ENV['
|
290
|
+
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, "structure.sql")
|
275
291
|
current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
|
276
292
|
ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
|
277
293
|
|
@@ -285,9 +301,9 @@ db_namespace = namespace :db do
|
|
285
301
|
db_namespace['structure:dump'].reenable
|
286
302
|
end
|
287
303
|
|
288
|
-
desc "
|
289
|
-
task :load => [:environment, :load_config] do
|
290
|
-
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['
|
304
|
+
desc "Recreates the databases from the structure.sql file"
|
305
|
+
task :load => [:environment, :load_config, :check_protected_environments] do
|
306
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:sql, ENV['SCHEMA'])
|
291
307
|
end
|
292
308
|
|
293
309
|
task :load_if_sql => ['db:create', :environment] do
|
@@ -319,7 +335,7 @@ db_namespace = namespace :db do
|
|
319
335
|
begin
|
320
336
|
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
|
321
337
|
ActiveRecord::Schema.verbose = false
|
322
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
338
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations['test'], :ruby, ENV['SCHEMA']
|
323
339
|
ensure
|
324
340
|
if should_reconnect
|
325
341
|
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[ActiveRecord::Tasks::DatabaseTasks.env])
|
@@ -329,7 +345,7 @@ db_namespace = namespace :db do
|
|
329
345
|
|
330
346
|
# desc "Recreate the test database from an existent structure.sql file"
|
331
347
|
task :load_structure => %w(db:test:purge) do
|
332
|
-
ActiveRecord::Tasks::DatabaseTasks.
|
348
|
+
ActiveRecord::Tasks::DatabaseTasks.load_schema ActiveRecord::Base.configurations['test'], :sql, ENV['SCHEMA']
|
333
349
|
end
|
334
350
|
|
335
351
|
# desc "Recreate the test database from a fresh schema"
|
@@ -349,11 +365,11 @@ db_namespace = namespace :db do
|
|
349
365
|
task :clone_structure => %w(db:test:deprecated db:structure:dump db:test:load_structure)
|
350
366
|
|
351
367
|
# desc "Empty the test database"
|
352
|
-
task :purge => %w(environment load_config) do
|
368
|
+
task :purge => %w(environment load_config check_protected_environments) do
|
353
369
|
ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations['test']
|
354
370
|
end
|
355
371
|
|
356
|
-
# desc '
|
372
|
+
# desc 'Load the test schema'
|
357
373
|
task :prepare => %w(environment load_config) do
|
358
374
|
unless ActiveRecord::Base.configurations.blank?
|
359
375
|
db_namespace['test:load'].invoke
|
@@ -366,7 +382,7 @@ namespace :railties do
|
|
366
382
|
namespace :install do
|
367
383
|
# desc "Copies missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2"
|
368
384
|
task :migrations => :'db:load_config' do
|
369
|
-
to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map
|
385
|
+
to_load = ENV['FROM'].blank? ? :all : ENV['FROM'].split(",").map(&:strip)
|
370
386
|
railties = {}
|
371
387
|
Rails.application.migration_railties.each do |railtie|
|
372
388
|
next unless to_load == :all || to_load.include?(railtie.railtie_name)
|
@@ -384,7 +400,7 @@ namespace :railties do
|
|
384
400
|
puts "Copied migration #{migration.basename} from #{name}"
|
385
401
|
end
|
386
402
|
|
387
|
-
ActiveRecord::Migration.copy(ActiveRecord::
|
403
|
+
ActiveRecord::Migration.copy(ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first, railties,
|
388
404
|
:on_skip => on_skip, :on_copy => on_copy)
|
389
405
|
end
|
390
406
|
end
|
@@ -11,7 +11,7 @@ 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
|
14
|
+
self._attr_readonly = Set.new(attributes.map(&:to_s)) + (self._attr_readonly || [])
|
15
15
|
end
|
16
16
|
|
17
17
|
# Returns an array of all the attributes that have been specified as readonly.
|