Search code examples
ruby-on-railsruby-on-rails-3activerecordrakerake-task

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 server 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.


Solution

  • 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