我有一个Rails 2.2项目,我想覆盖rake db:test:prepare任务的功能.我原以为这样行得通,但行不通:

#lib/tasks/db.rake
namespace :db do
  namespace :test do
    desc "Overridden version of rails' standard db:test:prepare task since the schema dump used in that can't handle DB enums"  
    task :prepare => [:environment] do
      puts "doing db:structure:dump"
      Rake::Task['db:structure:dump'].invoke
      puts "doing db:test:clone_structure"
      Rake::Task['db:test:clone_structure'].invoke
    end   
  end
end

我了解标准任务的行为.如果我将任务的名称改为:prepare2,然后执行rake db:test:prepare2,那么它就可以正常工作.我由此得出的自然结论是,我的rake任务是由内置的Rails任务定义的,因此我的任务被标准的:prepare任务覆盖.

有人知道我怎么解决这个问题吗?我宁愿重写它,也不必使用新任务.谢谢,麦克斯

推荐答案

如果定义了一个已经存在的rake任务,它的执行将附加到原始任务的执行中;这两项任务都将被执行.

如果要重新定义任务,需要先清除原始任务:

Rake::Task["db:test:prepare"].clear

还需要注意的是,一旦任务在rake中执行,即使您再次调用它,它也不会再次执行.这是经过设计的,但您可以对一个任务调用.reset,以允许它再次运行.

Ruby-on-rails相关问答推荐

DateTime的最小数据提交格式

Rails 7中的Turbo流

搜查升级到 4.0.0 和 ActionText::RichText

如何从 gem 覆盖 JSONAPI.configure

ActiveRecord 错误地转义 JSON 字符串

2个空格或1个制表符,Rails社区的缩进标准是什么?

从 Authlogic 迁移到 Devise

如何确定 Rails 是从 CLI、控制台还是作为服务器运行?

如何让空白复选框作为假传递给参数

如何在Ruby 中对数字进行上限和舍入

Rails:进行不可逆转的迁移是不是很糟糕?

加载常量时自动加载常量时检测到循环依赖

Rspec:如何在控制器规范中分配实例变量

通过get in rails传递参数数组

为什么 Google Oauth 在我的 Rails 应用程序中返回无效的 redirect_urI?

如何在 Rails 迁移中判断数据库类型?

列出关联模型的名称

在 Rails 3 中设置会话超时

您如何查看 ruby​​ 中的调用堆栈示例?

使用 ActiveRecord 获取列名