【问题标题】:How can I display a default message while running rails migrations?如何在运行 rails 迁移时显示默认消息?
【发布时间】:2013-03-18 08:25:18
【问题描述】:

我们正在将表数据移动到不同的数据库中进行归档。因此,当用户在主数据库中添加迁移时,我想显示一条默认消息,提醒他们对存档数据库中的表执行相同的迁移。我怎样才能做到这一点而不必在迁移中手动添加消息?

【问题讨论】:

  • 为什么不通过自定义rake db:migrate 定义同时在两个数据库上进行迁移?有关如何操作的提示,请参阅 stackoverflow.com/a/6379712/429758
  • 我们正在逐步移动表格。因此,并非所有表都存在于两个数据库中。

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


【解决方案1】:

Prakash 提出了一个优雅的解决方案。但是您最初的问题是关于覆盖默认任务以添加我相信的消息。

也许可以尝试这样的事情。礼貌:http://metaskills.net/2010/05/26/the-alias_method_chain-of-rake-override-rake-task/

Rake::TaskManager.class_eval do
  def alias_task(fq_name)
    new_name = "#{fq_name}:original"
    @tasks[new_name] = @tasks.delete(fq_name)
  end
end

def alias_task(fq_name)
  Rake.application.alias_task(fq_name)
end

def override_task(*args, &block)
  name, params, deps = Rake.application.resolve_args(args.dup)
  fq_name = Rake.application.instance_variable_get(:@scope).dup.push(name).join(':')
  alias_task(fq_name)
  Rake::Task.define_task(*args, &block)
end

现在您可以像这样覆盖 rake db:migrate。

 namespace :db do
    override_task :migrate => :environment do
      # Your message here
      # To invoke the original task add ":original" to its name
      Rake::Task["db:migrate:original"].execute
      ...
    end
 end

【讨论】:

  • 实际上,我正在考虑重写 ActiveRecord::Migration 类,但不确定它是否正确。
猜你喜欢
  • 2010-10-27
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
相关资源
最近更新 更多