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

Я видел несколько вопросов (а именно этот) здесь о 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

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

4 ответов


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.


в качестве варианта принятого ответа вы также можете использовать 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-docs


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

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

рельсы 4.2:

change_column_default :products, :approved, false

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

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


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