首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails \迁移缺少的\\在本地工作,但在Heroku上不起作用

Rails \迁移缺少的\\在本地工作,但在Heroku上不起作用
EN

Stack Overflow用户
提问于 2018-12-14 15:33:08
回答 2查看 918关注 0票数 2

这是我的第一篇文章,所以请告诉我,如果我能比我更好地说明我的问题:我已经搜索了网站,没有发现任何解决我的问题的地方。

我有一个带有事件模型的应用程序在本地运行。

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

一切都在本地运作。

当我将它部署到Heroku时,当我尝试创建一个事件条目时,我会得到一个500-error。

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

我查看了所有的东西,并确保它是一个允许的参数。

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

因此,我运行了rails g迁移AddEndDateToEvents,其中我写道:

代码语言:javascript
复制
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,因为它在模型中不存在。

我卡住了。我该怎么办?

我的源代码的引用

提前谢谢你!

奥利弗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-15 00:17:36

我用你的帮助解决了这个问题,马克!

我做了以下工作:

1)回滚迁移

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

当我试图回滚时,它给了我一个错误,我的remove列迁移是不可逆的。我必须输入列的类型。所以我把它作为第三个参数。示例:remove_column :events, :end_date, :date

在那之后,回滚是可能的。最简单的方法是运行rails db:rollback STEP=2。

2)删除迁移并检查模式

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

3)创建条件删除行迁移

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

代码语言:javascript
复制
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:迁移

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

现在起作用了!-)

非常感谢。我被那些快速而有帮助的回复吓了一跳,而且有些人在网上花了时间编辑我的帖子,并很好地格式化了它。

慷慨的社区。好的!

票数 2
EN

Stack Overflow用户

发布于 2018-12-14 15:48:49

就像你说的,你的迁移不同步。覆盖这两个基的最佳方法是在迁移中添加一个条件。Rails附带了一个名为column_exists的方法?

exists%3F

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

代码语言:javascript
复制
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 DB中的任何数据,那就更好了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53782678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档