#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
проверку. Это действительно не имеет ничего общего с ошибкой драйвера базы данных