Как переопределить задачи rake для пользовательского адаптера базы данных?

Я написал собственный адаптер базы данных, который работает правильно и эффективно, когда работает сервер rails. Теперь я хотел бы добавить обычные определения задачи rake для создания, удаления и переноса базы данных.

Я хотел бы реализовать:

db:[drop|create|migrate]

Как мне упаковать эти определения с моим драгоценным камнем, чтобы они переопределяли определения по умолчанию для всех, кто использует драгоценный камень?

Я просмотрел исходный код других адаптеров, но вся логика задачи rake, похоже, встроена в саму active_record, каждая задача просто включает имя адаптера.


person TCopple    schedule 01.06.2011    source источник
comment
Вы уверены, что хотите переопределить их? Было бы запутанно, если бы ваши не работали точно так же, как стандартные, и если ваши работают точно так же, как стандартные, тогда версии AR должны быть в порядке.   -  person mu is too short    schedule 01.06.2011
comment
@mu да, я совершенно уверен. /activerecord/railties/databases.rake просто делегирует определенные методы (например, drop_database, create_database), и эти методы включают известные адаптеры соединения (mysql, sqlite, postgressql и т. д.). Если пользовательский адаптер не назван одним из предоставленных, у вас нет возможности вызывать собственные реализации drop and create.   -  person TCopple    schedule 02.06.2011
comment
Вау, невероятно. Я не ожидал, что ActiveRecord будет настолько глупым и плохо спроектированным, я бы подумал, что все это будет запихнуто в драйвер базы данных. Я так понимаю, вы пытаетесь добавить драйвер Oracle или что-то в этом роде?   -  person mu is too short    schedule 03.06.2011


Ответы (2)


Это возможно с:

# 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
person captainpete    schedule 16.06.2011

Ты можешь написать

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

чтобы удалить исходную задачу перед ее переопределением. Также ознакомьтесь с Переопределение задач rake по умолчанию для рельсов

person knugie    schedule 04.04.2014