How do I override rake tasks for a custom database adapter?
I've written a custom database adapter that works correctly and effectively when a rails s开发者_开发问答erver is running. I would now like to add the usual rake task definitions for creating, dropping and migrating the database.
I would like to implement:
db:[drop|create|migrate]
How do I package these definitions with my gem so that they override the default ones for anyone who uses the gem?
I looked through the source of other adapters but all the rake task logic appears to be baked into active_record itself, each task just switches on the adapter name.
This is possible with:
# somewhere in your gem's tasks
Rake::Task['db:create'].clear
# then re-define
namespace 'db' do
task 'create' do
# ...
end
end
When Take::Task#[]
can't resolve a task it will fail
.
If your tasks sometimes exists, you might want to:
task_exists = Rake.application.tasks.any? { |t| t.name == 'db:create' }
Rake::Task['db:create'].clear if task_exists
If you want to add tasks to an existing rake task, use enhance
.
Rake::Task['db:create'].enhance do
Rake::Task['db:after_create'].invoke
end
You can write
Rake::Task['db:create'].clear
to delete the original task before redefining it. Also check out Overriding rails' default rake tasks
精彩评论