【问题标题】:Rails | Migration missing | Works locally but not on Heroku导轨 |迁移缺失 |在本地工作,但不在 Heroku 上
【发布时间】:2018-12-14 15:33:08
【问题描述】:

这是我在 Stackoverflow 上的第一篇文章,如果我能比我更好地说明我的问题,请告诉我:我已经搜索了该网站,但没有找到任何可以解决我的问题的内容。

我有一个使用 Event 模型在本地运行的应用。

该模型有一个 start_date 列,我后来添加了一个带有迁移的 end_date

一切都在本地工作。

当我将它部署到 Heroku 时,我在尝试创建 Event 条目时收到 500-错误。

它首先给了我一个 ActiveRecord::MultiparameterAssignmentErrors,说它不能为 end_date= 分配任何东西。

我查看了所有内容并确保它是允许的参数。

然后我查看了我的迁移并惊讶地发现我的 AddEndDateToEvents 迁移不存在,但 end_date 列在我的模式模型中。

所以我运行了 rails g migration AddEndDateToEvents,我在其中写道:

class AddEndDateToEvents < ActiveRecord::Migration[5.2]
  def change
    remove_column :events, :end_date
    add_column :events, :end_date, :date
  end
end

我运行了 rails db:migrate,一切都在本地运行。

现在,当我将它推送到 Heroke 并在那里运行 db:migrate 时,它当然会终止并告诉我它无法删除列 end_date 因为它模型中不存在。

我被困住了。我该怎么办? :(

我的源代码参考

提前谢谢你!

奥利弗

【问题讨论】:

  • 您本地数据库中的end_date 列是从哪里来的?据推测,来自较早的迁移?如果是这样,为什么 Heroku 上不存在这种迁移?

标签: ruby-on-rails heroku


【解决方案1】:

在你的帮助下我解决了,马克! :-)

我做了以下事情:

1) 回滚迁移

我运行rails db:migrate:status 并看到我应该回滚两次迁移以完全清除我添加/删除 end_date 列的尝试。

当我尝试回滚时,它给了我一个错误,即我的删除列迁移不可逆。我必须输入列的类型。所以我将其添加为第三个参数。示例:remove_column :events, :end_date, :date

之后可以进行回滚。最简单的方法是运行 rails db:rollback STEP=2

2) 删除向下迁移并检查架构

回滚迁移后,我从文件夹中删除了不需要的迁移文件。此外,我检查了我的架构文件并从模型中手动删除了 end_date 行。

3) 创建有条件的删除行迁移

使用 Mark 的回答,我使用以下代码添加了一个新迁移:

class AddEndDateToEvents < ActiveRecord::Migration[5.2]
  def change
    remove_column(:events, :end_date) if column_exists?(:events, :end_date)
    add_column :events, :end_date, :date
  end
end

4) 重置数据库并运行 db:migrate

然后我执行了我的 git push && git push heroku,然后我运行了 heroku restart &amp;&amp; heroku pg:reset DATABASE --confirm APP-NAME &amp;&amp; heroku run rake db:migrate,其中 APP-NAME 是我的应用程序的名称。

现在它可以工作了! :-)

非常感谢。我对快速而有帮助的回复感到非常震惊,而且互联网上的某些人花时间编辑我的帖子并很好地格式化它。

慷慨的社区。不错!

【讨论】:

    【解决方案2】:

    如您所说,您的迁移似乎不同步。涵盖这两个基础的最佳方法是在迁移中添加条件。 Rails 自带一个名为 column_exists 的方法?

    https://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/column_exists%3F

    我们可以在迁移中使用的:

    class AddEndDateToEvents < ActiveRecord::Migration[5.2]
      def change
        remove_column(:events, :end_date) if column_exists?(:events, :end_date)
        add_column :events, :end_date, :date
      end
    end
    

    无论初始迁移是否已运行,现在都应该可以工作了

    编辑:最好让两个数据库保持同步,因此如果您的 Heroku DB 中没有重要数据,您可以随时简单地删除它,重新创建它并从头开始运行所有迁移。我认为如果你能承受丢失 Heroku 数据库中的任何数据,那会更好

    【讨论】:

    • “在迁移中添加条件”——这让我不寒而栗。 IMO 一个更好(虽然更痛苦)的解决方案是手动修复任何形状错误的数据库,使两者同步。这应该与schema.rb 文件以及运行所有迁移的累积结果相匹配。然后,一旦有了一致且稳定的基础,就从那里编写一个新的迁移。
    • 感谢您的快速回复! :-) 我在 Heroku 上运行了 pg:reset 并且刷新的数据库不起作用。没有迁移表明添加了 end_date 列。因此,从外观上看,Heroku 构建是“正确”的构建,而我的本地构建却以某种方式关闭。我有一种感觉,如果我在本地运行 db:reset,那么我会在这里遇到同样的错误。所以我要试试你的 column_exists 吗?解决方案,因为这听起来很合适:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多