Datamapper和ActiveRecord:迁移rake任务

时间:2011-10-05 10:39:40

标签: ruby-on-rails ruby-on-rails-3 activerecord datamapper

My Rails 3应用程序使用Datamapper(dm-rails)作为其主要ORM,但它还需要加载ActiveRecord,因为我正在使用的自定义gem需要它。

我的问题是该应用程序现在有两个db:migrate rake任务,如果我运行rake db:migrate,我会收到以下错误:

rake aborted!
VERSION is required

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

如何确保隐藏ActiveRecord rake任务,以便我可以执行Datamapper迁移任务?使用automigrate不是一种选择。另外,我想使用实际的db:migrate rake任务,而不是另一个rake任务,而不是一些控制台解决方法。

编辑:我目前的解决方法是简单地复制db命名空间下的Datamapper rake任务,并在不同命名空间下的自定义任务文件中重新定义它们。这有效。这似乎是多余的,我更喜欢更清洁的解决方案。

1 个答案:

答案 0 :(得分:0)

AHA!我不知道这是否与您遇到的问题相同,但我发现在我的应用程序中,问题出在config/application.rb

对于Datamapper项目,应使用以下代码替换require 'rails/all'行:

# 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'

db:migrate的Datamapper rake任务实际上包含在dm-rails/railtie中(不在dm-migrations中)。我相信问题(AR rake db任务)在active_resource / railtie中,如果您使用的是DataMapper,则不需要。

我不知道rake如何决定使用哪个任务,但我认为如果两个任务都已定义,它会尝试使用相同的名称运行这两个任务。

但是,在您的情况下,您可能实际上需要 active_resource/railtie,在这种情况下,除了使用其他命名空间之外,我能想到的唯一解决方案是覆盖db:在自定义任务文件中使用类似的东西迁移rake任务:

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