Добавление: default => true для логического значения в существующем столбце Rails - PullRequest
150 голосов
/ 25 декабря 2011

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

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

Ответы [ 6 ]

301 голосов
/ 25 декабря 2011

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

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

rails g migration add_default_value_to_show_attribute

Затем в миграции создано:

# That's the more generic way to change a column
def up
  change_column :profiles, :show_attribute, :boolean, default: true
end

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

ИЛИ более конкретный вариант:

def up
    change_column_default :profiles, :show_attribute, true
end

def down
    change_column_default :profiles, :show_attribute, nil
end

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

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

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

93 голосов
/ 16 октября 2013

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

30 голосов
/ 07 мая 2016

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

change_column_null :products, :name, false

Rails 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

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

1 голос
/ 24 октября 2018

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

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

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

0 голосов
/ 14 ноября 2018

Также по документу:

значение по умолчанию не может быть указано в командной строке

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

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

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

0 голосов
/ 06 июня 2017
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...