我在我的ruby模型和控制器中有学生和课程,所以我想把这两件事联系起来,显示一个用户和他注册的课程,点击这些课程,看看课程里面有什么。我是ruby的新手,所以我对has_many了解不多,我找不到可以让我想工作的东西。
我使用scaffold来创建模型和控制器,user只有名字,email和courses只有course_name
学生:
create_table :student do |t|
t.string :name
t.string :email
课程:
create_table :course do |t|
t.string :name
t.timestamps
在学生索引中我只列出了我所有的学生。请帮帮忙
3条答案
按热度按时间lnvxswe21#
看起来您想在
students
和courses
之间使用多对多关联。有许多方法可以实现这一点。我会使用这里描述的has_many :though
选项,在其中添加一个名为StudentCourse
的额外模型。因此,在您的场景中,您将:
1.使用
rails generate model StudentCourse student:references model:references
生成此StudenCourse模型1.将以下内容添加到
Student
模型1.将以下内容添加到您的
Course
模型1.使用
rake db:migrate
运行迁移1.现在,您可以开始向课程添加学生,反之亦然。例如:
在控制器中,您可以简单地调用
student.courses
来查看与给定学生相关联的课程,或调用course.students
来查看正在学习特定课程的学生。注意
Course
和Student
模型现在如何使用has_many: ..., through: :student_courses
相互关联。使用这种多对多关联的另一个好处是灵活性。例如,您可能希望开始记录学生是否放弃了特定课程。只需向这个新的
student_courses
表中添加一个dropped_at
列即可。编辑
添加几个更详细的示例来说明如何使用此新关联:
如前所述,您可以通过Rails控制台向学生添加课程,反之亦然。例如,ID为1的学生想要注册ID为2的课程:
类似地,您可以像这样将学生添加到课程:
在幕后,这两个关联都将创建我们添加的
StudentCourse
类的新示例。因此,创建此关联的第三个选项是:gajydyqb2#
这里您最可能需要的实际上是多对多的关联。不是一对多。
这允许您使用
courses
作为包含课程信息的规范化表,而不是为每个学生复制它。enrollments
作为一个连接表,允许您将任意数量的学生连接到任意数量的课程。它也是您存储描述学生和课程之间关系的信息的地方-例如学生的成绩(分数)。bmp9r5qi3#
您需要设置关系,即。模型类中的关联。
现在,你可能在一个名为app/models的文件夹中有两个模型类(假设scaffolding已经创建了它们):
在app/models/student.rb中,你需要有这样的东西:
在app/models/curso.rb中,你需要有这样的东西:
这就是在rails中创建关联的方式。