如何在Ruby on Rails中创建一对多模型关系?

uqzxnwby  于 2023-05-06  发布在  Ruby
关注(0)|答案(3)|浏览(144)

我在我的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

在学生索引中我只列出了我所有的学生。请帮帮忙

lnvxswe2

lnvxswe21#

看起来您想在studentscourses之间使用多对多关联。有许多方法可以实现这一点。我会使用这里描述的has_many :though选项,在其中添加一个名为StudentCourse的额外模型。
因此,在您的场景中,您将:
1.使用rails generate model StudentCourse student:references model:references生成此StudenCourse模型
1.将以下内容添加到Student模型

class Student
      ...
      has_many :student_courses
      has_many :courses, through: student_courses
      ...
    end

1.将以下内容添加到您的Course模型

class Course
      ...
      has_many :student_courses
      has_many :students, through: student_courses
      ...
    end

1.使用rake db:migrate运行迁移
1.现在,您可以开始向课程添加学生,反之亦然。例如:

Student.last.courses << Course.last
    Course.first.students << Student.first

在控制器中,您可以简单地调用student.courses来查看与给定学生相关联的课程,或调用course.students来查看正在学习特定课程的学生。
注意CourseStudent模型现在如何使用has_many: ..., through: :student_courses相互关联。
使用这种多对多关联的另一个好处是灵活性。例如,您可能希望开始记录学生是否放弃了特定课程。只需向这个新的student_courses表中添加一个dropped_at列即可。

编辑

添加几个更详细的示例来说明如何使用此新关联:
如前所述,您可以通过Rails控制台向学生添加课程,反之亦然。例如,ID为1的学生想要注册ID为2的课程:

Student.find(1).courses << Course.find(2)

类似地,您可以像这样将学生添加到课程:

Course.find(2).students << Student.find(1)

在幕后,这两个关联都将创建我们添加的StudentCourse类的新示例。因此,创建此关联的第三个选项是:

StudentCourse.create(student: Student.find(1), course: Course.find(2))
gajydyqb

gajydyqb2#

这里您最可能需要的实际上是多对多的关联。不是一对多。

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

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

class Enrollment < ApplicationRecord
  belongs_to :student
  belongs_to :course
end

这允许您使用courses作为包含课程信息的规范化表,而不是为每个学生复制它。
enrollments作为一个连接表,允许您将任意数量的学生连接到任意数量的课程。它也是您存储描述学生和课程之间关系的信息的地方-例如学生的成绩(分数)。

bmp9r5qi

bmp9r5qi3#

您需要设置关系,即。模型类中的关联。
现在,你可能在一个名为app/models的文件夹中有两个模型类(假设scaffolding已经创建了它们):

  • app/models/student.rb
  • app/models/curso.rb

在app/models/student.rb中,你需要有这样的东西:

class Student < ActiveRecord::Base

  belongs_to :curso

end

在app/models/curso.rb中,你需要有这样的东西:

class Curso < ActiveRecord::Base

  has_many :students

end

这就是在rails中创建关联的方式。

相关问题