我有连接到多个数据库的rails应用程序.我写了自定义rake任务,看起来像这样:
task :migrate_accounts_schema => [:environment] do |t|
users = User.find :all, :conditions => ["state = 2"], :order => "id asc"
users.each do |user|
if user.state == 2
ActiveRecord::Base.establish_connection(
:adapter => "postgresql",
:host => user.database_host,
:port => user.database_port,
:username => user.subdomain,
:password => "#{user.database_password}",
:database => user.database_name
)
Rake::Task["db:migrate"].invoke
end
end
end
Run Code Online (Sandbox Code Playgroud)
问题是任务执行db:仅针对users [0]用户(集合中的第一个用户)进行迁移并且没有错误,只是静默地停止...
这是rake --trace的输出
** Invoke app:migrate_accounts_schema (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute app:migrate_accounts_schema
** Invoke db:migrate (first_time)
** Invoke environment
** Execute db:migrate
** …Run Code Online (Sandbox Code Playgroud) 根据Stephen Hagemann的这篇文章,我正试图为我的一个rake任务写一个Rspec测试.
lib/tasks/retry.rake:
namespace :retry do
task :message, [:message_id] => [:environment] do |t, args|
TextMessage.new.resend!(args[:message_id])
end
end
Run Code Online (Sandbox Code Playgroud)
spec/tasks/retry_spec.rb:
require 'rails_helper'
require 'rake'
describe 'retry namespace rake task' do
describe 'retry:message' do
before do
load File.expand_path("../../../lib/tasks/retry.rake", __FILE__)
Rake::Task.define_task(:environment)
end
it 'should call the resend action on the message with the specified message_id' do
message_id = "5"
expect_any_instance_of(TextMessage).to receive(:resend!).with message_id
Rake::Task["retry:message[#{message_id}]"].invoke
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此测试时,我收到以下错误:
Don't know how to build task 'retry:message[5]'
Run Code Online (Sandbox Code Playgroud)
另一方面,当我运行没有参数的任务时:
Rake::Task["retry:message"].invoke
Run Code Online (Sandbox Code Playgroud)
我能够调用rake任务,但测试失败,因为没有message_id.
我将参数传递给rake任务的方式有什么问题? …