change_column_null для существующего столбца - PullRequest
7 голосов
/ 21 января 2012

Я пытаюсь изменить возможность nil логического атрибута в существующем столбце :access_titles в таблице :profiles.Этот столбец существует из-за этой миграции:

class AddAccessItemsToProfiles < ActiveRecord::Migration
  def self.up
    add_column :profiles, :access_items, :boolean, :default => true
  end

  def self.down
    remove_column :profiles, :access_items, :boolean, :default => nil
  end
end

Чтобы изменить nil, я попытался сгенерировать миграцию, как всегда:

rails g migration ChangeColumnNull :profiles :access_items :null => false

Но это ничего не дало, поэтому я сделалавтономная миграция:

rails g migration AddChangeColumnNullToAccessItems

И в этом я добавил:

class AddChangeColumnNullToAccessItems < ActiveRecord::Migration
  def self.up
    change_column_null :profiles, :access_items, :boolean, false
  end

  def self.down
    change_column_null :profiles, :access_items, :boolean, true
  end
end

Затем я запустил rake db:migrate, перезапустил свой сервер и не увидел изменений.Поэтому я попытался:

class AddChangeColumnNullToAccessItems < ActiveRecord::Migration
  def self.up
    change_column_null :profiles, :access_items, false
  end

  def self.down
    change_column_null :profiles, :access_items, true
  end
end

Затем сделал то же самое: rake db:migrate, перезагрузил сервер и ничего не изменилось.

Что я делаю не так?Я надеялся, что только логическое значение :access_items будет истинным и ложным без необходимости выгрузки базы данных.

ОБНОВЛЕНИЕ: Попытка change_column_null :profiles, :access_items, false Я получил ошибку:

-- change_column_null(:profiles, :access_items, false)
rake aborted!
An error has occurred, this and all later migrations canceled:

PGError: ERROR:  column "access_items" contains null values
: ALTER TABLE "profiles" ALTER "access_items" SET NOT NULL

Итак, согласно приведенному ниже совету, мне пришлось вставить change_column_null :profiles, :access_items, false, true в мою миграцию.

1 Ответ

25 голосов
/ 21 января 2012

Вы можете использовать:

change_column_null :profiles, :access_items, false, 1

Четвертый параметр является необязательным и позволяет установить значение по умолчанию для столбца. Это необходимо, когда у вас есть нулевые значения в столбце, и вы устанавливаете нулевое значение на false.

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