Ruby on Rails: Як додати ненульове обмеження до наявного стовпця за допомогою міграції?


130

У моєму додатку Rails (3.2) у моїй базі даних є маса таблиць, але я забув додати кілька ненульових обмежень. Я гуглився навколо, але не можу знайти, як записати міграцію, яка додає ненуле до існуючого стовпця.

ТІА.

Відповіді:


93

Для Rails 4+ відповідь натів (використовуючи change_column_null ) краще.

Попередньо Rails 4, спробуйте змінити стовпець .


25
Будьте уважні з таким підходом - якщо у вас були інші атрибути щодо цього стовпця (наприклад, :limitобмеження), вам потрібно повторити ці атрибути при використанні change_column, інакше вони будуть втрачені. З цієї причини я вважаю за краще використовуватиchange_column_null
Натан Уоллес

Зауважте, що це створює коефіцієнт, IrreversibleMigrationякий може бути не тим, що ви хочете.
Нік Нілов

@NicNilov, ти говориш про відповідь АБО коментар Натана Уоллеса?
Марк

@ Марк Я говорив про відповідь, вибачте, що не був достатньо конкретним.
Нік Нілов

@NicNilov no dw Я думав, що хоч я просто хотів подвійно перевірити :)
Марк

274

Ви також можете використовувати change_column_null :

change_column_null :table_name, :column_name, false

8
Найясніша відповідь!
Джош Клік

1
Мені довелося змінити це для групи стовпців, і для цього не потрібно вказувати тип стовпця для кожного стовпця, ще краще!
Доріан

1
Це краща відповідь. У своїй базі даних я додавав нульове обмеження у стовпчик із попередньо наявними нульовими значеннями. change_column не змінює ці значення. Згідно з документацією, change_column_null має необов'язкове четверте значення, яке є новим значенням для оновлення.
Merovex

Дякую за це Найкраща відповідь.
Райан Ребо

1
цікавий побічний ефект .... відкат міграції встановить поле на протилежне (false -> true). Отже, якщо ви створили міграцію для кількох полів, щоб додати нульове обмеження, а деякі поля ВЖЕ мали обмеження з нульовим значенням, а потім відкатуйте міграцію, вона ВИДАЄТЬ нульове обмеження з будь-якого поля, у якому воно вже було.
jpw

10

1) ПЕРШИЙ: Додайте стовпчик із значенням за замовчуванням

2) ТАКОЖ: Видаліть значення за замовчуванням

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil

2
це правильне рішення, коли вам потрібно додати новий стовпець, який не є нульовим, потрібно спочатку визначити, що він має значення за замовчуванням, оскільки SQLLite буде скаржитися (Неможливо додати стовпець NOT NULL зі значенням за замовчуванням NULL), а потім видалити його!
Мілан

2

Якщо ви використовуєте його для нового сценарію / схеми створення міграції, ось як ми можемо це визначити

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.