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任务,并在不同命名空间下的自定义任务文件中重新定义它们。这有效。这似乎是多余的,我更喜欢更清洁的解决方案。
答案 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