【问题标题】:Rails -- Possible to run migration methods in generic rake task?Rails -- 可以在通用 rake 任务中运行迁移方法吗?
【发布时间】:2010-07-28 19:41:15
【问题描述】:

我知道这不是最佳实践,而且很可能甚至不应该使用,因为这就是迁移的用途,但我想知道是否可以在常规 rake 任务中执行迁移特定命令。比如:

namespace :dummy do
    task :update => :environment do
      add_column :users, :deleted, :boolean, { :null => false, :default => false }
   end
end

谢谢

【问题讨论】:

    标签: ruby-on-rails migration rake


    【解决方案1】:

    可以在您的 rake 任务中运行任意伪迁移:

    namespace :dummy do
      task :update => :environment do
        ActiveRecord::Base.connection.add_column :users, :deleted, :boolean, :null => false, :default => false
      end
    end
    

    如果你经常做这类事情,请使用速记:

    namespace :dummy do
      task :update => :environment do
        c = ActiveRecord::Base.connection
    
        c.add_column :users, :deleted, :boolean, :null => false, :default => false
      end
    end
    

    【讨论】:

    • 很高兴知道。我没有意识到这些函数是连接类的一部分。谢谢。
    • 如果你环顾四周,那里有很多好东西。我是连接对象的忠实粉丝,尤其是 select_values 之类的东西。
    【解决方案2】:

    是的,你应该这样做:

    namespace :dummy do
      task :update => :enviroment do
        ActiveRecord::Migration.send(:add_column, :users, :deleted, :boolean, { :null => false, :default => false })
      end
    end
    

    未测试,但这里重要的是包含迁移类,然后发送您希望运行的方法。

    更新直接通过@tadman 使用ActiveRecord::Migration

    【讨论】:

    • 包含任意迁移似乎很奇怪。为什么不直接针对 ActiveRecord::Migration 呢?
    • 出于某种原因,我假设如果我直接使用 ActiveRecord::Migration 类,它会尝试在 schema_migrations 表中插入一条记录
    • 我相信触发对 schema_migrations 表的添加的唯一方法是定义一个 ActiveRecord::Migration.up 方法并运行它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2011-09-07
    • 1970-01-01
    • 2011-03-04
    • 2015-07-12
    • 2017-01-01
    相关资源
    最近更新 更多