Вставка в ассоциативную таблицу не допускается без «опционально: true»? - PullRequest
0 голосов
/ 21 октября 2018

Я работаю над проектом Ruby on Rails для одного из моих классов, и мое текущее задание требует, чтобы я разрешил пользователям записываться на курсы.У меня есть три модели: Пользователь, Курс и таблица ассоциативного соединения, которая принадлежит обеим, Регистрация.Текущие настройки в rb-файле каждой модели:

class Enrollment < ApplicationRecord
  belongs_to :user
  belongs_to :course
end

class Course < ApplicationRecord
  has_many :enrollments
  has_many :users, through: :enrollments
end

class User < ApplicationRecord
  has_many :enrollments
  has_many :courses, through: :enrollments
end

Основная проблема заключается в том, что всякий раз, когда я пытаюсь добавить новую запись в модель Enrollment из консоли rails, выдается сообщение об ошибке:

[4] pry(main)> enrollment = Enrollment.new(u_id: 1, c_id: 1)
=> #<Enrollment:0x00007f94bc771020 id: nil, u_id: 1, c_id: 1, ...>
[5] pry(main)> enrollment.save
  (0.1ms)  begin transaction
  (0.1ms)  rollback transaction
=> false
[6] pry(main)> enrollment.errors

=> #<ActiveModel::Errors:0x00007f94bc7c7290
@base=#<Enrollment:0x00007f94bc771020 id: nil, u_id: 1, c_id: 1, created_at:
nil, updated_at: nil>,
@details={:user=>[{:error=>:blank}], :course=>[{:error=>:blank}]},
@messages={:user=>["must exist"], :course=>["must exist"]}>

В нем утверждается, что пользователь и курс должны существовать, но обе модели заполнены и работают по отдельности.Однако, изменив мой enrollment.rb на:

class Enrollment < ApplicationRecord
  belongs_to :user, optional: true
  belongs_to :course, optional: true
end

, это позволяет мне добавить новую запись регистрации просто отлично.Кто-нибудь знает, почему мне нужно «опционально: правда», чтобы это работало?Кто-нибудь знает способ исправить это, не используя «опционально: правда»?Любая помощь будет оценена.Я также хочу рассказать подробнее, пожалуйста, дайте мне знать.

Спасибо!

1 Ответ

0 голосов
/ 21 октября 2018

Используемые вами внешние ключи отличаются от того, что вы определили в ассоциациях, и от того, что вы ожидаете, когда используете соглашения rails.

В соответствии с соглашениями rails, table_name_id должно быть определено какколонка.так что в вашем случае это должно быть course_id и user_id, поскольку вы связываете с course модель и user модель.

Он ожидает course_id и user_id как иностранныйключ, но вы определили внешние ключи как c_id и u_id.

Чтобы решить эту проблему, вы должны переопределить соглашения по рельсам, явно указав использовать эти внешние ключи вместо того, что предполагается.

Внесите некоторые изменения в модель зачисления

class Enrollment < ApplicationRecord
  belongs_to :user, class_name: 'User', foreign_key: 'u_id'
  belongs_to :course, class_name: 'Course', foreign_key: 'c_id'
end

Теперь вы можете удалить необязательный true.

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