rails 6 внешний ключ не может быть нулевым - PullRequest
1 голос
/ 28 мая 2019

У меня есть файл миграции, как показано ниже:

def change
    create_table :carts do |t|
      t.string :order_number
      t.decimal :total_price
      t.bigint :user_id, null: true
      t.string :status

      t.timestamps
    end
  end

Я хочу, чтобы user_id был нулевым, но мой файл схемы перевел эту миграцию на:

t.bigint "user_id", null: false

Так что в моей модели cart.rb, даже если у меня есть

belongs_to :user, optional: true

, она не работает, и когда я пытаюсь сохранить объект корзины, я получаю ForeignKey не может быть нулевой ошибкой!

Как я могу разрешить нулевое значение для внешнего ключа?

1 Ответ

1 голос
/ 28 мая 2019

Миграции не являются декларацией текущей структуры БД, они представляют собой изменения, которые при объединении создают ее. Для комбинированных рельсов есть db/schema.rb (или schema.sql для более сложных сценариев)

Если столбец равен null: false, то он должен был быть изменен при более поздней миграции (или напрямую в db, если так - структура db может быть не синхронизирована между разработкой и производством). Если вы хотите, чтобы он снова был null: true - добавьте еще одну миграцию, которая изменит это. Но сначала я бы выяснил, почему он оказался в текущем состоянии, может быть, есть причина.

change_column :carts, :user_id, :bigint, null:true
...