Добавление: 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