没有“可选:真”,不允许插入关联表吗?

时间:2018-10-21 00:44:48

标签: ruby-on-rails database activerecord

我正在为我的一个课程从事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

主要问题是,每当我尝试从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

它可以让我添加一个新的注册条目。谁知道为什么我需要“ optional:true”才能工作?有谁知道一种无需使用“ optional:true”即可解决此问题的方法?任何帮助,将不胜感激。我也愿意详细说明,所以请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:2)

您使用的外键与关联中定义的外键以及使用rails约定时的预期外键不同。

根据rails约定,table_name_id应该定义为一列。 因此在您与course_id模型和user_id模型建立关联时,您的情况应该是courseuser

期望course_iduser_id作为外键,但您已将外键定义为c_idu_id

要解决此问题,您必须通过明确告诉Rails约定使用这些外键而不是假定的外键来覆盖rails约定。

对注册模型进行一些更改

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。