Datamapper и ActiveRecord: задачи грабли миграции - PullRequest
2 голосов
/ 05 октября 2011

Приложение My Rails 3 использует Datamapper (dm-rails) в качестве основного ORM, но ему также необходимо загрузить ActiveRecord, как того требует пользовательский гем, который я использую.

Моя проблема в том, что в приложении теперь есть две db:migrate грабли, и если я запускаю rake db:migrate, я получаю следующую ошибку:

rake aborted!
VERSION is required

Tasks: TOP => db:migrate => db:migrate:up
(See full trace by running task with --trace)

Как мне убедиться, что грабли ActiveRecord скрыты, чтобы я мог выполнить задачу переноса Datamapper? Использование автомиграции не вариант. Кроме того, я хочу использовать реальную задачу db:migrate rake, а не другую задачу rake и не какой-нибудь обходной путь консоли.

Редактировать: Мой текущий обходной путь - просто скопировать грабли Datamapper в пространстве имен db и переопределить их в файле пользовательских задач в другом пространстве имен. Это работает. Это кажется излишним, и я бы предпочел более чистое решение.

1 Ответ

0 голосов
/ 12 апреля 2012

AHA! Я не знаю, является ли это той же проблемой, что и у вас, но я обнаружил, что в моем приложении проблема была в config/application.rb:

Строка: require 'rails/all' должна быть заменена для проектов Datamapper на:

# Pick the frameworks you want:
require 'action_controller/railtie'
require 'dm-rails/railtie'
# require 'action_mailer/railtie'
# require 'active_resource/railtie'
# require 'rails/test_unit/railtie'

Задача rake Datamapper для db: migrate фактически включена в dm-rails/railtie (не в dm-migrations). Я считаю, что проблема (задача AR rake db) находится в active_resource / railtie, что вам не нужно, если вы используете DataMapper.

Я не знаю, как rake решает, какие задачи использовать, но я понимаю, что он пытается запустить обе задачи с одинаковым именем, если они определены.

Однако в ВАШЕМ случае вам может понадобиться active_resource/railtie, и в этом случае единственное решение, которое я могу придумать, кроме использования другого пространства имен, такого как обходной путь, - переопределить db: migrate. Rake Task, используя что-то вроде этого в пользовательском файле задачи:

namespace :db do
  Rake::Task["db:migrate"].clear
  task :migrate do
    ...
  end
end
...