我正在为我的一个课程从事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”即可解决此问题的方法?任何帮助,将不胜感激。我也愿意详细说明,所以请告诉我。
谢谢!
答案 0 :(得分:2)
您使用的外键与关联中定义的外键以及使用rails约定时的预期外键不同。
根据rails约定,table_name_id
应该定义为一列。
因此在您与course_id
模型和user_id
模型建立关联时,您的情况应该是course
和user
。
期望course_id
和user_id
作为外键,但您已将外键定义为c_id
和u_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。