这是我的第一篇文章,所以请告诉我,如果我能比我更好地说明我的问题:我已经搜索了网站,没有发现任何解决我的问题的地方。
我有一个带有事件模型的应用程序在本地运行。
该模型有一个start_date列,我后来添加了一个带有迁移的end_date。
一切都在本地运作。
当我将它部署到Heroku时,当我尝试创建一个事件条目时,我会得到一个500-error。
它首先给了我一个ActiveRecord::MultiparameterAssignmentErrors,它说它不能为end_date=分配任何东西。
我查看了所有的东西,并确保它是一个允许的参数。
然后我查看了我的迁移,发现我的AddEndDateToEvents迁移并不存在,但end_date列在我的模式模型中,这让我感到惊讶。
因此,我运行了rails g迁移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,因为它在模型中不存在。
我卡住了。我该怎么办?
我的源代码的引用
提前谢谢你!
奥利弗
发布于 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的答案,我使用以下代码添加了一个新的迁移:
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
end4)重置数据库并运行db:迁移
然后我做了git推&& git推heroku,然后运行了heroku restart && heroku pg:reset DATABASE --confirm APP-NAME && heroku run rake db:migrate,其中应用程序名是我的应用程序的名称。
现在起作用了!-)
非常感谢。我被那些快速而有帮助的回复吓了一跳,而且有些人在网上花了时间编辑我的帖子,并很好地格式化了它。
慷慨的社区。好的!
发布于 2018-12-14 15:48:49
就像你说的,你的迁移不同步。覆盖这两个基的最佳方法是在迁移中添加一个条件。Rails附带了一个名为column_exists的方法?
我们可以在我们的迁徙中使用:
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中的任何数据,那就更好了。
https://stackoverflow.com/questions/53782678
复制相似问题