我遇到了一个非常奇怪的问题。我有一个任务可以重置我的数据库:
task :reset => [:drop, :create, :migrate, :seed]
问题是,我在播种时收到错误,因为在后期迁移文件中添加了缺少的列。一个例子:
undefined method new_attr= for User
然而,此属性已在迁移中添加。奇怪的是,如果我单独运行上述任务,我会收到没有错误。任何人都能解释一下吗?当然,这些任务不能异步运行。
避免错误的另一种方法是使用新属性修改我之前的迁移create_。然后运行:reset不会触发这些属性的错误。
迁移显然很好,因为我可以单独运行上述任务,而不是捆绑在单个任务下。
答案 0 :(得分:1)
可能你的问题已经解决了:
rake db:reset
rake db:reset任务将删除数据库,重新创建它并将当前架构加载到其中。
您是否尝试使用命名空间?
任务:reset => [db:drop,db:create,db:migrate,db:seed]
答案 1 :(得分:1)
也许你想让你的重置任务更明确?
namespace :db_tasks do
desc "Rebuild development db"
task :rebuild_database, [] => :environment do
raise "Only run in development or staging" if Rails.env.production?
Rake::Task['db:drop'].execute
Rake::Task['db:create'].execute
Rake::Task['db:migrate'].execute
Rake::Task['db:seed'].execute
Rake::Task['db:test:prepare'].execute
end
end
答案 2 :(得分:1)
如果在生产模式下执行这些rake任务, 模型属性被缓存。即使迁移工作完美,它也不适用于缓存。 这将破坏您的后续种子,因为缓存中将缺少新添加的列。 一种可能的解决方案是在播种前重新加载rails环境。