Добавить значение по умолчанию в столбец с помощью миграции

230

Как добавить значение по умолчанию в столбец, который уже существует при миграции?

Вся документация, которую я могу найти, показывает вам, как это сделать, если столбец еще не существует, но в этом случае он это делает.

Теги:
migration

7 ответов

334

Вот как это сделать:

change_column :users, :admin, :boolean, :default => false

Но некоторые базы данных, такие как PostgreSQL, не будут обновлять поле для ранее созданных строк, поэтому убедитесь, что вы также обновили поле manaully при миграции.

  • 13
    Если вам нужны обратимые миграции, поместите это в блок up а не в блок change . Вы можете оставить down блок пустым. Таблица не вернется к исходному состоянию, но миграцию можно откатить.
  • 1
    Сохранит ли это данные нетронутыми?
Показать ещё 6 комментариев
156
change_column_default :employees, :foreign, false
  • 12
    Это должен быть полностью принятый ответ.
  • 0
    Это работает для всех баз данных, таких как pg или mysql?
Показать ещё 4 комментария
95

Для Rails 4+ используйте change_column_default

def change
  change_column_default :table, :column, value
end
  • 1
    Это прекрасно, особенно если у вас есть миграция, которая добавляет столбец и устанавливает значения по умолчанию для существующих записей. Например: def change `add_column: foos,: name, default:" что-то для существующих значений "` `change_column_default: foos,: name, default:" "` end
  • 0
    Эта миграция имеет странное поведение. В твоем примере это необратимо. edgeguides.rubyonrails.org/active_record_migrations.html рекомендую использовать его следующим образом: change_column_default :products, :approved, from: true, to: false - но это тоже не работает.
Показать ещё 2 комментария
41

Использование def change означает, что вы должны писать миграции, которые являются обратимыми. И change_column не обратимо. Вы можете подняться, но вы не можете спуститься, так как change_column является необратимым.

Вместо этого, хотя это может быть пара дополнительных строк, вы должны использовать def up и def down

Итак, если у вас есть столбец без значения по умолчанию, вы должны сделать это, чтобы добавить значение по умолчанию.

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: nil
end

Или если вы хотите изменить значение по умолчанию для существующего столбца.

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: true
end
33

** Рельсы 4.X + **

Начиная с Rails 4, вы не можете сгенерировать миграцию для добавления столбца в таблицу со значением по умолчанию . Следующие шаги добавляют новый столбец в существующую таблицу со значением по умолчанию true или false.

1. Запустите миграцию из командной строки, чтобы добавить новый столбец.

$ rails generate migration add_columnname_to_tablename columnname:boolean

Приведенная выше команда добавит новый столбец в вашу таблицу.

2. Установите для нового значения столбца значение ИСТИНА/ЛОЖЬ, отредактировав новый созданный файл миграции.

class AddColumnnameToTablename < ActiveRecord::Migration
  def change
    add_column :table_name, :column_name, :boolean, default: false
  end
end

** 3. Чтобы внести изменения в таблицу базы данных приложения, выполните следующую команду в терминале **

$ rake db:migrate
  • 0
    Чем это отличается от рельсов 3+ или 2+?
  • 1
    Кто-нибудь знает, было ли это включено в Rails 5?
8

Execute:

rails generate migration add_column_to_table column:boolean

Он сгенерирует эту миграцию:

class AddColumnToTable < ActiveRecord::Migration
  def change
    add_column :table, :column, :boolean
  end
end

Задайте значение по умолчанию: default = > 1

add_column: table,: column,: boolean,: default = > 1

Run:

rake db: migrate

  • 2
    Теперь значение по умолчанию 1 не совсем булево;) Кроме того, этот экзамен добавляет новый столбец вместо изменения существующего столбца, чего и хотел достичь ОП.
  • 0
    @radiospiel На самом деле, 1 тоже логическое значение :)
-46

Это то, что вы можете сделать:

class Profile < ActiveRecord::Base
  before_save :set_default_val

  def set_default_val
    self.send_updates = 'val' unless self.send_updates
  end
end
  • 0
    Лучше, если вы установите значение по умолчанию в схеме как before_save
  • 6
    Какое ужасное предложение
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню