【问题标题】:What did I do wrong with my Rails migrations for Heroku?我对 Heroku 的 Rails 迁移做错了什么?
【发布时间】:2015-09-22 07:07:30
【问题描述】:

我正在尝试将我的Address 表的text 属性添加为我的Brewery 表的address 属性,然后删除Address 表。在 git push heroku master 之后,我通过运行 heroku run rake db:migrate 在 Heroku 上执行此操作。

我为数据创建新字段的第一次迁移工作正常。但是我的第二次迁移立即失败-它说找不到Address 表。我的第三次迁移从未运行,但它应该删除Address 表以整理所有内容。

我做错了什么?这些迁移在我的本地机器上工作,但在 Heroku 上失败:

1:

class AddAddressStringToBrewery < ActiveRecord::Migration
  def change
    add_column :breweries, :address, :string
  end
end

2:

class MoveAddressToString < ActiveRecord::Migration
  def change
    Address.all.each do |address|
      brewery = address.brewery
      brewery.update(address: address.text)
    end
  end
end

3:

class DropAddressTable < ActiveRecord::Migration
  def change
    drop_table :addresses
  end
end

我最好的猜测是 Heroku 在运行我的迁移之前正在读取我的架构并删除表。我总是可以在单独的 git 提交中进行这些迁移以强制它工作,但我真的很想知道我哪里出错了。

谢谢!

【问题讨论】:

  • 所以你的最终目标是删除addresses 表?为什么在这种情况下其他迁移很重要?
  • 我的最终目标是在删除之前将数据从addresses表中迁移出来。

标签: ruby-on-rails heroku rails-migrations


【解决方案1】:

这是因为您的迁移文件名的顺序错误。 Rails 将根据文件名的时间戳迁移文件。因此,如果您希望 #2 在 #3 之前运行,则必须将其重命名为 #3 之前的文件名时间戳。

此外,您没有显示创建地址表的迁移。该表可能不在您的生产数据库中。

【讨论】:

    【解决方案2】:

    尝试heroku run rake db:migrate 更新您的生产数据库。

    【讨论】:

    • 我就是这么做的。我更新了我的问题以澄清这一点。我的问题是我的第二次迁移立即失败,因为我的地址表不见了。这不应该在迁移 #3 之前发生。
    • 啊,仔细一看,我发现您在第二次迁移中使用了地址模型。将表放在本地后,您是否也破坏了模型?如果是这样,那么迁移现在将失败,因为您的文件中没有地址。
    【解决方案3】:

    我意识到我做错了什么。我通过这些迁移推送到 Heroku 也删除了我的地址模型。当我在本地环境中运行它们时,是在我清理旧地址代码之前。我添加了足够长的地址模型来运行迁移,它们都运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多