所以我在Rails项目中进行了迁移:
class CreateSettings < ActiveRecord::Migration[5.2]
def change
create_table :settings do |t|
t.string :frequency
t.text :emails, array: true, default: [].to_yaml
t.integer :reorder
t.timestamps
end
end
end
默认值最初使它失败,因此我创建了另一个迁移以删除该默认值:
class ChangeDefaultColumnForSetting < ActiveRecord::Migration[5.2]
def change
change_column_default(:settings, :emails, nil)
end
end
该模式现在看起来不错,并且默认值已消失,但是当我将其推送到Heroku并运行heroku run rails db:migrate
时,由于原始迁移CreateSettings
仍然包含默认值,因此它失败。即使我从第一次迁移中手动删除了默认值,在Heroku中也会出现“ Expected 1 arguments,而得到0”错误。
关于如何解决这个问题的任何想法?迁移可以在开发中进行,因此它只能是Postgres问题(因为我在开发人员中使用SQLite)。
答案 0 :(得分:2)
一个快速解决方案是删除ChangeDefaultColumnForSetting
迁移并编辑CreateSettings
来说明:
t.text :emails, array: true, default: []
或
t.text :emails, array: true, default: nil
然后提交更改并推送到Heroku。
在那之后,如果要在PostgreSQL上进行部署,您真的想停止使用SQLite。在SQLite之上进行开发并在PostgreSQL上进行部署将引起各种问题。您确实需要使用相同的数据库进行开发,测试和部署。帮自己一个忙,在本地安装PostgreSQL,以便可以使用与部署时相同的数据库进行测试和开发。
或者,您可以在迁移中查看Rails.env
,并在不同的环境中运行不同的代码。但这确实是一个坏主意。