这是我的第一篇Stackoverflow帖子,所以请让我知道我是否可以指定比我更好的问题:我已经搜索了该站点,但没有发现任何可以解决我的问题的东西。
我有一个本地运行的应用,该应用具有事件模型。
该模型有一个开始日期列,后来我添加了一个带有迁移的结束日期。
一切都在本地工作。
当我将其部署到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 列,因为它在模型中不存在。
我被困住了。我该怎么办? :(
我的源代码参考
提前谢谢!
橄榄
答案 0 :(得分:0)
您所说的迁移似乎不同步。覆盖这两个基础的最佳方法是在迁移中添加条件。 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数据库中的任何数据,那将是更好的选择
答案 1 :(得分:0)
我在您的帮助下解决了,马克! :-)
我做了以下事情:
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 && heroku pg:reset DATABASE --confirm APP-NAME && heroku run rake db:migrate
,其中APP-NAME是我的应用程序的名称。
现在可以使用了! :-)
非常感谢。快速而有用的回复让我震惊,而且互联网上有人在那里花了很多时间来编辑我的帖子并对其进行格式化。
慷慨的社区。很好!