Добавление: default => true для boolean в существующем столбце Rails

Я видел несколько вопросов (а именно this one) здесь, на SO о добавлении булевского значения по умолчанию в существующий столбец. Поэтому я попробовал предложение change_column, но я не должен делать это правильно.

Я пробовал:

$ change_column :profiles, :show_attribute, :boolean, :default => true

Что возвращает -bash: change_column: command not found

Затем я побежал:

$ rails g change_column :profiles, :show_attribute, :boolean, :default => true

... и

$ rails change_column :profiles, :show_attribute, :boolean, :default => true

Затем пробег rake db:migrate, но значение для :show_attribute осталось nil. В вопросе, на который я ссылался выше, он говорит в PostgreSQL, вам нужно обновить его вручную. Поскольку я использую PostgreSQL, я добавил следующее в моей миграции create_profiles:

t.boolean :show_attribute, :default => true

Может ли кто-нибудь сказать мне, что я здесь делаю неправильно?

Ответ 1

change_column - это метод ActiveRecord::Migration, поэтому вы не можете называть его так, как в консоли.

Если вы хотите добавить значение по умолчанию для этого столбца, создайте новый перенос:

rails g migration add_default_value_to_show_attribute

Затем в созданном перемещении:

def up
  change_column :profiles, :show_attribute, :boolean, default: true
end

def down
  change_column :profiles, :show_attribute, :boolean, default: nil
end

Затем запустите rake db:migrate.

Он ничего не изменит к уже созданным записям. Для этого вам нужно будет создать rake task или просто зайти в rails console и обновить все записи.

Когда вы добавили t.boolean :show_attribute, :default => true в миграцию create_profiles, это нормально, если ничего не сделано. Выполняются только миграции, которые еще не были запущены. Если вы начали с новой базы данных, то она установила значение по умолчанию равным true.

Ответ 2

В качестве вариации принятого ответа вы также можете использовать метод change_column_default в ваших перемещениях:

def up
  change_column_default :profiles, :show_attribute, true
end

def down
  change_column_default :profiles, :show_attribute, nil
end

Rails API-документы

Ответ 3

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

change_column_null :products, :name, false

Рельсы 5:

change_column_default :products, :approved, from: true, to: false

http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns

Rails 4.2:

change_column_default :products, :approved, false

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

Это простой способ избежать просмотра ваших миграций или схемы для спецификаций столбца.

Ответ 4

Если вы только что выполнили миграцию, вы можете выполнить откат, а затем снова выполнить миграцию.

Для отката вы можете сделать столько шагов, сколько захотите:

rake db:rollback STEP=1

Или, если вы используете Rails 5.2 или новее:

rails db:rollback STEP=1

Затем вы можете просто выполнить миграцию снова:

def change
  add_column :profiles, :show_attribute, :boolean, default: true
end

Не забудьте rake db:migrate и если вы используете heroku run rake db:migrate

Ответ 5

change_column :things, :price_1, :integer, default: 123, null: false

Кажется лучшим способом добавить значение по умолчанию к существующему столбцу, у которого уже нет null: false.

В противном случае:

change_column :things, :price_1, :integer, default: 123

Некоторые исследования, которые я сделал по этому поводу:

https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b

Ответ 6

Кроме того, согласно документу:

по умолчанию нельзя указать через командную строку

https://guides.rubyonrails.org/active_record_migrations.html

Так что нет готового рельса генератора. Как указано в ответах выше, вы должны вручную заполнить файл миграции с change_column_default метода change_column_default.

Вы можете создать свой собственный генератор: https://guides.rubyonrails.org/generators.html