Rails migrations: Undo default setting for a column

Ruby on-RailsRails Migrations

Ruby on-Rails Problem Overview


I have the problem, that I have an migration in Rails that sets up a default setting for a column, like this example:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

Suppose, I like to drop that default settings in a later migration, how do I do that with using rails migrations?

My current workaround is the execution of a custom sql command in the rails migration, like this:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

But I don't like this approach, because I am now dependent on how the underlying database is interpreting this command. In case of a change of the database this query perhaps might not work anymore and the migration would be broken. So, is there a way to express the undo of a default setting for a column in rails?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

Rails 5+
def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end
Rails 3 and Rails 4
def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

Solution 2 - Ruby on-Rails

Sounds like you're doing the right thing with your 'execute', as the docs point out:

> change_column_default(table_name, column_name, default) > > Sets a new default value for a column. > If you want to set the default value > to NULL, you are out of luck. You need > to DatabaseStatements#execute the > appropriate SQL statement yourself. > Examples > > change_column_default(:suppliers, :qualification, 'new') > change_column_default(:accounts, :authorized, 1)

Solution 3 - Ruby on-Rails

The following snippet I use to make NULL columns NOT NULL, but skip DEFAULT at schema level:

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

Solution 4 - Ruby on-Rails

Rails 4

change_column :courses, :name, :string, limit: 100, null: false

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionwulfovitchView Question on Stackoverflow
Solution 1 - Ruby on-RailsJeremy MackView Answer on Stackoverflow
Solution 2 - Ruby on-RailsSerxView Answer on Stackoverflow
Solution 3 - Ruby on-RailsAlex FortunaView Answer on Stackoverflow
Solution 4 - Ruby on-RailsLesly RevengeView Answer on Stackoverflow