【问题标题】:Rake sequential tasks耙顺序任务
【发布时间】:2013-04-10 12:30:20
【问题描述】:

我遇到了一个非常奇怪的问题。我有一个重置我的数据库的任务:

task :reset => [:drop, :create, :migrate, :seed]

问题是,我在播种时收到错误,因为缺少在后期迁移文件中添加的列。一个例子:

undefined method new_attr= for User

然而,这个属性已经在迁移中添加了。奇怪的是,如果我单独运行上述任务,我会收到 no 错误。任何人都可以解释一下吗?当然这些任务不能异步运行。

另一种避免错误的方法是使用新属性修改我之前的迁移 create_。然后运行 ​​:reset 不会触发这些属性的错误。

迁移显然很好,因为我可以单独运行上述任务,而不是捆绑在单个任务下。

【问题讨论】:

    标签: ruby-on-rails rake


    【解决方案1】:

    也许你想让你的重置任务更明确?

    namespace :db_tasks do
      desc "Rebuild development db"
      task :rebuild_database, [] => :environment do
        raise "Only run in development or staging" if Rails.env.production?
    
        Rake::Task['db:drop'].execute
        Rake::Task['db:create'].execute
        Rake::Task['db:migrate'].execute
        Rake::Task['db:seed'].execute
        Rake::Task['db:test:prepare'].execute
      end
    end
    

    【讨论】:

      【解决方案2】:

      你的问题可能已经用这个解决了:

      rake db:reset
      

      rake db:reset 任务将删除数据库,重新创建它并将当前架构加载到其中。

      你尝试过命名空间吗?

      task :reset => [db:drop, db:create, db:migrate, db:seed]

      【讨论】:

        【解决方案3】:

        如果这些 rake 任务在生产模式下执行, 模型属性被缓存。即使迁移工作完美,它也不适用于缓存。 这将破坏您的后续种子,因为缓存中将缺少新添加的列。 一种可能的解决方案是在播种之前重新加载您的 Rails 环境。

        【讨论】:

          猜你喜欢
          • 2012-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多