运行db:test:在Rake任务中准备抛出环境

时间:2015-05-19 21:49:11

标签: ruby-on-rails database rake

我有以下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任务中移除Rake::Task["db:test:prepare"].invokeclone是正确的,但我不确定原因

2 个答案:

答案 0 :(得分:1)

我的猜测是第一个任务是不使用控制台环境,因为它为rake创建了自己的终端会话,第二个是。

尝试printenv并比较变量

还尝试使用RAILS_ENV=development或任何您想要的环境为命令添加前缀。

答案 1 :(得分:1)

guides.rubyonrails.org表示任务db:test:prepare用于对您的测试数据库执行以下操作:

  1. 删除数据库
  2. 创建数据库
  3. 运行迁移
  4. 完成此任务后,您将无法获得任何数据。这是堆栈溢出答案,解释了这一点:

    1. PG undefinedtable error relation users does not exist
    2. What does rake db:test:prepare actually do
    3. 我相信你所看到的行为与环境无关,而是对这种佣金任务的误解。