我有以下2个rake
任务:
task :clone => :environment do |t, args|
Rake::Task["db:drop"].invoke
Rake::Task["db:create"].invoke
system "pg_restore -O -d database_name last_dump"
Rake::Task["db:migrate"].invoke
Rake::Task["db:test:prepare"].invoke
# Try to force the rails env to reload, but this doesn't solve the problem
Rake::Task["environment"].execute
Rake::Task["db:company_count"].invoke
end
task :company_count => :environment do
puts Company.count
end
当我运行rake db:clone
时,Company.count
的输出为0,表明数据库中没有公司,但当我运行rake db:clone && rake db:company_count
时,输出为2。
如何在第一个任务中加载数据库后获得正确的Company.count
?
Company.count
是正确的,如果我从clone
任务中删除Rake::Task["db:test:prepare"].invoke
,但我不确定为什么
我猜第一个任务不使用控制台环境,因为它为rake创建了自己的终端会话,第二个任务使用控制台环境。
尝试printenv
并比较变量
还可以尝试使用RAILS_ENV=development
或任何您想要的环境作为命令的前缀。
guides.rubyonrails.org指示任务db:test:prepare
用于对测试数据库执行以下操作:
- 删除数据库创建数据库
- 运行迁移
在此任务完成后,您将没有任何数据在那里。下面是解释这个问题的堆栈溢出答案:
- PG undefinedtable错误关系用户不存在 rake db:test:prepare到底做了什么
我相信你所看到的行为与环境无关,而是对这个rake任务意图的误解。