假设我有两个数据库:一个用于学生,一个用于课程。我希望能够为特定学生“添加”课程,并且能够将学生添加到特定课程。我假设我需要在这里使用连接表,但我对如何使用它们有点迷失。我最终希望能够做到这样的事情:
@class.students.find(@student_id)
这会告诉我学生是否在课堂上。我知道班级和学生之间的关系是'has_many',反之亦然。在迁移文件中做't.references:students'能做到吗?我尝试将该行添加到我的迁移文件中,然后尝试使用上面的语句查找内容并且它给了我一个错误。我是RoR的新手,所以我甚至不确定实现这一目标的最佳方法是什么。任何帮助表示赞赏!
答案 0 :(得分:65)
@Jordan所说的一切都是真的,这里采取具体步骤:
rails g model CourseStudent
为n:m关系创建连接模型,并迁移到相应的表。编辑迁移文件CreateCourseStudent
,使其包含以下内容:
class CreateCourseStudent < ActiveRecord::Migration
def change
create_table :course_students do |t|
# Your code comes here
t.integer :student_id
t.integer :course_id
# Here comes the generated code
t.timestamps
end
end
end
运行迁移:rake db:migrate
。因此,连接表现在应该存在于您的数据库中。
向模型中添加以下代码
class Course < ActiveRecord::Base
has_many :course_students
has_many :students, :through => :course_students
end
class Student < ActiveRecord::Base
has_many :course_students
has_many :courses, :through => :course_students
end
class CourseStudent < ActiveRecord::Base
belongs_to :student
belongs_to :course
end
您现在可以使用方法belongs_to
和has_many
生成的方法:
@course.students
@student.courses
尝试在Rails Guides中找到所有相关的事实和摘要,在那里您应找到所需的所有信息以便进入正轨。祝你好运!
答案 1 :(得分:15)
这是一个老问题,但万一有人像我一样偶然发现这个问题,你现在可以建立关系has_and_belongs_to_many
。所以是的,你会创建一个连接表:
create_join_table :students, :courses do |t|
t.integer :student_id
t.integer :course_id
end
然后在模型中,你会说一个学生has_and_belongs_to_many :courses
课程has_and_belongs_to_many :students
。没有必要创建名为CourseStudent的第三个类。这个link包含所有这些信息
答案 2 :(得分:14)
是的,这是一个多对多关系(班级有很多学生,学生有很多班级)。为此,您将使用has_many :through
关系。查看ActiveRecord::Associations
的文档(Ctrl-F表示“关联连接模型”)。
在迁移过程中,t.references :students
是您指定belongs_to
关系的方式,因为它只会添加student_id
列(只能容纳一个ID,即一个学生)。但是,连接模型将包含两列:student_id
和class_id
。 (顺便说一句,在Ruby中调用模型'Class'是在寻找麻烦。我可以建议'课程'吗?)