По-прежнему получает NotNullViolation, несмотря на belongs_to:foo, необязательно: true

#ruby-on-rails #ruby-on-rails-6

#ruby-on-rails #ruby-on-rails-6

Вопрос:

У меня есть has_one belongs_to ассоциация и, вот так:

 # teacher.rb
has_one: :student
 

и

 # student.rb 
belongs_to :teacher, optional: true
 

но когда я пытаюсь создать ученика без учителя…

 a = Student.new()
a.save!
ActiveRecord::NotNullViolation: PG::NotNullViolation: ERROR:  null value in column "teacher_id" violates not-null constraint
 

Что не имеет смысла, поскольку у меня есть optional: true . Я пробовал rake db:drop db:create db:migrate db:seed много раз, но все та же ошибка

Комментарии:

1. как выглядит ваша миграция для таблицы student — это ошибка DB, а не ошибка проверки модели

2. @dbugger Я просто очень удивлен, что модель не заботится о вещах, так как AFAIK в документах сказано просто добавить optional: true , и все будет хорошо. (Сейчас я проверю миграцию)

3. Модель заботится о модели.

4. Это null: false причина, по которой вы теперь получаете ошибку, так как из-за этого ваш столбец базы данных не допускает нулевых значений. Вам нужно будет выполнить миграцию для установки null: true для этого столбца, чтобы он работал так, как вы ожидаете

5. optional И его обратные required параметры belongs_to просто контролируют, добавляет ли ассоциация presence_of проверку. Это действительно не имеет ничего общего с подобной ошибкой драйвера базы данных.

Ответ №1:

Благодаря @dbugger и @Daniel Sindrestean и с помощью другого форума я вижу, что это так же просто, как зайти в существующий файл миграции и изменить null: false на null: true . Затем переделайте базу данных. Или запустите миграцию для изменения null:true , если работаете с существующим приложением. В любом случае, null: false должно быть null: true

Кроме того, из комментария @max:

optional И его обратные required параметры belongs_to просто контролируют, добавляет ли ассоциация presence_of проверку. Это действительно не имеет ничего общего с ошибкой драйвера базы данных