如何覆盖自定义数据库适配器的rake任务?

时间:2011-06-01 18:30:15

标签: ruby-on-rails ruby-on-rails-3 activerecord rake rake-task

我编写了一个自定义数据库适配器,可以在rails服务器运行时正常有效地工作。我现在想添加用于创建,删除和迁移数据库的常用rake任务定义。

我想实施:

db:[drop|create|migrate]

如何将这些定义打包到我的gem中,以便它们覆盖使用gem的任何人的默认定义?

我查看了其他适配器的来源,但所有rake任务逻辑似乎都被烘焙到active_record本身,每个任务只是打开适配器名称。

2 个答案:

答案 0 :(得分:12)

这可以通过以下方式实现:

# somewhere in your gem's tasks
Rake::Task['db:create'].clear

# then re-define
namespace 'db' do
  task 'create' do
    # ...
  end
end

Take::Task#[]无法解析任务it will fail时。 如果您的任务有时存在,您可能希望:

task_exists = Rake.application.tasks.any? { |t| t.name == 'db:create' }
Rake::Task['db:create'].clear if task_exists

如果您要任务添加到现有佣金任务,请使用enhance

Rake::Task['db:create'].enhance do
  Rake::Task['db:after_create'].invoke
end

答案 1 :(得分:3)

你可以写

Rake::Task['db:create'].clear

在重新定义之前删除原始任务。 另请查看Overriding rails' default rake tasks