问题描述
||
我不希望Rails 3在每次迁移时都生成我的架构。如何正确禁用它?
谢谢
解决方法
像这样创建一个特定于应用程序的任务(如Alex Kaushovik所建议的)。
创建一个文件“ 0”(实际名称没有关系,您在lib \\ tasks中需要一个.rake文件),其内容如下所示(向Matthew Bass授予ѭ1cr)
Rake::TaskManager.class_eval do
def remove_task(task_name)
@tasks.delete(task_name.to_s)
end
end
Rake.application.remove_task(\'db:schema:dump\')
namespace :db do
namespace :schema do
task :dump do
# Overridden to do nothing
end
end
end
, 对于仍在寻找在迁移后禁用数据库转储的方法的人,rails 4中现在提供了一个配置,可以将其设置为false,如下所示:
config.active_record.dump_schema_after_migration = false
将阻止它。在此更改中添加了配置-https://github.com/rails/rails/pull/13948
, 根据David Waller的回答进行的修改,保留了手动运行db:schema:dump的功能。涵盖了自动调用架构转储的所有任务。基于相关任务的Rails 3.2.14版本-更改rails版本时,您将要确保任务定义仍然有效。
认真地,应该有一个配置选项来禁用自动模式转储。
Rake::TaskManager.class_eval do
def remove_task(task_name)
@tasks.delete(task_name.to_s)
end
Rake.application.remove_task(\"db:migrate\")
Rake.application.remove_task(\"db:rollback\")
Rake.application.remove_task(\"db:forward\")
Rake.application.remove_task(\"db:migrate:up\")
Rake.application.remove_task(\"db:migrate:down\")
end
namespace :db do
desc \"Migrate the database (options: VERSION=x,VERBOSE=false).\"
task :migrate => [:environment,:load_config] do
ActiveRecord::Migration.verbose = ENV[\"VERBOSE\"] ? ENV[\"VERBOSE\"] == \"true\" : true
ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths,ENV[\"VERSION\"] ? ENV[\"VERSION\"].to_i : nil) do |migration|
ENV[\"SCOPE\"].blank? || (ENV[\"SCOPE\"] == migration.scope)
end
# db_namespace[\'_dump\'].invoke
end
desc \'Rolls the schema back to the previous version (specify steps w/ STEP=n).\'
task :rollback => [:environment,:load_config] do
step = ENV[\'STEP\'] ? ENV[\'STEP\'].to_i : 1
ActiveRecord::Migrator.rollback(ActiveRecord::Migrator.migrations_paths,step)
# db_namespace[\'_dump\'].invoke
end
# desc \'Pushes the schema to the next version (specify steps w/ STEP=n).\'
task :forward => [:environment,:load_config] do
step = ENV[\'STEP\'] ? ENV[\'STEP\'].to_i : 1
ActiveRecord::Migrator.forward(ActiveRecord::Migrator.migrations_paths,step)
# db_namespace[\'_dump\'].invoke
end
namespace :migrate do
# desc \'Runs the \"up\" for a given migration VERSION.\'
task :up => [:environment,:load_config] do
version = ENV[\'VERSION\'] ? ENV[\'VERSION\'].to_i : nil
raise \'VERSION is required\' unless version
ActiveRecord::Migrator.run(:up,ActiveRecord::Migrator.migrations_paths,version)
# db_namespace[\'_dump\'].invoke
end
# desc \'Runs the \"down\" for a given migration VERSION.\'
task :down => [:environment,:load_config] do
version = ENV[\'VERSION\'] ? ENV[\'VERSION\'].to_i : nil
raise \'VERSION is required\' unless version
ActiveRecord::Migrator.run(:down,version)
# db_namespace[\'_dump\'].invoke
end
end
end
, 我已经测试了以下内容-它可以正常工作:
您可以在服务器上的Rails gem \ lib / tasks文件夹内修改文件\“ databases.rake \”。用以下代码注释掉行:
Rake::Task[\"db:schema:dump\"].invoke if ActiveRecord::Base.schema_format == :ruby
在Ubuntu(和Ubuntu服务器)上,默认情况下位于以下位置:/var/lib/gems/1.8/gems/rails-x.x.x/lib/tasks/databases.rake。
在Rails 2.3.11上进行了测试,但是我很确定它也可以在Rails 3.x.x中使用。
另一个可能的解决方案(未测试):
您无需修改Rails文件,只需修改您的应用程序即可。
可以使用名为\“ override_rake_task \”的Rails插件来覆盖Rake任务\“ db:schema:dump \”,该任务在Rails gem中定义。
显然,如果您不使用此插件,并且在Rails应用程序中使用相同的名称定义任务,则rake会执行这两个任务:默认任务和您的任务。
, Active Record的默认行为是转储架构,但是只有在架构转储格式设置为ruby(默认值)时,它才会这样做。
通过将模式格式设置为sql,可以在迁移后禁用模式转储。迁移完成后,您可以安全地将其反转为红宝石,而不会产生任何后果。
您可以通过以下方式进行操作:
1)如果您有这样的一行,则将模式显式设置为ruby:
config.active_record.schema_format = :ruby
(它可能位于config / application.rb中,位于config /环境中或在运行迁移的特定环境中)。
然后将其注释掉:
#config.active_record.schema_format = :ruby
2)然后在您正在使用的环境中或在config / application.rb中添加一行以将架构格式设置为SQL,如下所示:
config.active_record.schema_format = :sql
, 建议您创建一个单独的任务,而不是覆盖db:migrate行为(这在开发中构建迁移时显然是必需的,而在部署时则是不必要的)。
# http://stackoverflow.com/questions/13646840/how-to-make-rake-dbmigrate-generate-schema-rb-when-using-sql-schema-format
namespace :db do
desc \"Migrate the database,without dumping the schema.rb\"
task :deploy => :environment do
ActiveRecord::Migration.verbose = ENV[\"VERBOSE\"] ? ENV[\"VERBOSE\"] == \"true\" : true
ActiveRecord::Migrator.migrate(\"db/migrate/\",nil)
end
end
然后,在部署过程中,您只需
rake db:deploy