kolbykskk
kolbykskk

Reputation: 111

Trying to db:migrate inside of heroku, migration is failing it

So I have this migration inside of my Rails project:

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

The default value was originally failing it so I created another migration in order to remove that default value:

class ChangeDefaultColumnForSetting < ActiveRecord::Migration[5.2]
  def change
    change_column_default(:settings, :emails, nil)
  end
end

The schema now looks good and that default value is gone but when I push it up to Heroku and run heroku run rails db:migrate, it fails at the original CreateSettings migration since it still includes the default value. Even if I remove that default value from the first migration manually, I get a "Expected 1 argument but got 0" error inside of Heroku.

Any ideas on how I can go about this? The migration works in development so it must just be a Postgres problem (as I'm using SQLite in dev).

Upvotes: 0

Views: 61

Answers (1)

mu is too short
mu is too short

Reputation: 434585

A quick fix is to delete the ChangeDefaultColumnForSetting migration and edit CreateSettings to say:

t.text :emails, array: true, default: []

or

t.text :emails, array: true, default: nil

Then commit the changes and push to Heroku.

After that you really want to stop using SQLite if you're deploying on PostgreSQL. Developing on top of SQLite and deploying on PostgreSQL is going to cause all kinds of problems. You really need to develop, test, and deploy with the same database. Do yourself a big favor and install PostgreSQL locally so that you can test and develop with the same database that you're deploying with.

Alternatively, you could look at Rails.env in your migrations and run different code in different environments. But really, this is a bad idea.

Upvotes: 2

Related Questions