7

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

我想实现:

db:[drop|create|migrate]

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

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

4

2 回答 2

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#[]无法解决任务时,它会fail。如果您的任务有时存在,您可能希望:

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

如果要将任务添加到现有的 rake 任务,请使用enhance.

Rake::Task['db:create'].enhance do
  Rake::Task['db:after_create'].invoke
end
于 2011-06-16T23:16:37.423 回答
3

你可以写

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

在重新定义之前删除原始任务。还可以查看Overriding rails 的默认 rake 任务

于 2014-04-04T20:21:00.420 回答