【问题标题】:How do I override rake tasks for a custom database adapter?如何覆盖自定义数据库适配器的 rake 任务?
【发布时间】:2011-09-06 13:14:05
【问题描述】:

我编写了一个自定义数据库适配器,它在 Rails 服务器运行时可以正常有效地工作。我现在想添加用于创建、删除和迁移数据库的常用 rake 任务定义。

我想实现:

db:[drop|create|migrate]

如何将这些定义与我的 gem 打包,以便它们覆盖任何使用 gem 的人的默认定义?

我查看了其他适配器的来源,但所有 rake 任务逻辑似乎都被烘焙到了 active_record 本身,每个任务只是打开适配器名称。

【问题讨论】:

  • 您确定要覆盖它们吗?如果你的工作与标准的不完全一样,如果你的工作与标准的完全一样,那么 AR 版本应该没问题。
  • @mu 是的,我很确定。 /activerecord/railties/databases.rake 只是委托给它定义的方法(例如 drop_database、create_database),这些方法会打开已知的连接适配器(mysql、sqlite、postgressql 等)。如果自定义适配器未命名为提供的适配器之一,则您无法调用自己的 drop 和 create 实现。
  • 哇,难以置信。我没想到 ActiveRecord 会如此愚蠢和设计糟糕,我原以为所有这些东西都会被推到数据库驱动程序中。我认为您正在尝试添加 Oracle 驱动程序或类似的东西?

标签: ruby-on-rails ruby-on-rails-3 activerecord rake rake-task


【解决方案1】:

这可以通过:

# somewhere in your gem's tasks
Rake::Task['db:create'].clear

# then re-define
namespace 'db' do
  task 'create' do
    # ...
  end
end

Take::Task#[] 无法解决任务it will 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

【讨论】:

    【解决方案2】:

    你可以写

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

    在重新定义之前删除原始任务。 另请查看Overriding rails' default rake tasks

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2014-08-10
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      相关资源
      最近更新 更多