rails: 多对多关联-自定义关联表(has_and_belongs_to_many)

关联has_and_belongs_to_many与另一个模型建立直接的多对多关系,无需中间模型。此关联表示声明模型的每个实例都引用另一个模型的零个或多个实例。

例如,考虑一个具有AssemblyPart模型的应用程序,其中每个组件可以包含多个部件,并且每个部件可以在多个组件中使用。您可以按如下方式设置模型:

01 换一个常见的场景

我们可以使用“学生(Student)”和“课程(Course)”的多对多关系作为例子。以下是如何在 Rails 中实现这一过程的步骤:

02 生成模型

首先,使用 Rails 生成 StudentCourse 模型:

rails g model Student name:string
rails g model Course title:string

03 生成连接表(关系表)

然后,生成一个连接表,名为 courses_students,用于建立 studentscourses 之间的多对多关系:

rails g migration CreateJoinTableCoursesStudents courses students

04 修改迁移文件

在生成的迁移文件中(在 db/migrate 目录下),确保包含索引以优化查询。你的迁移文件可能如下所示:

class CreateJoinTableCoursesStudents < ActiveRecord::Migration[6.1]
  def change
    create_join_table :courses, :students do |t|
      t.index :course_id
      t.index :student_id
    end
  end
end

05 更新模型(多-Model)

接下来,编辑 app/models/student.rbapp/models/course.rb 文件,添加关系定义:

app/models/student.rb

class Student < ApplicationRecord
  has_and_belongs_to_many :courses
end

app/models/course.rb

class Course < ApplicationRecord
  has_and_belongs_to_many :students
end

06 示例

现在,假设你想要添加一些学生和课程,可以在 Rails 控制台中执行如下命令

# 创建学生
student1 = Student.create(name: "Alice")
student2 = Student.create(name: "Bob")

# 创建课程
course1 = Course.create(title: "Math 101")
course2 = Course.create(title: "History 201")

# 关联学生和课程 - 这个就直接保存了
student1.courses << course1
student1.courses << course2
student2.courses << course1
rubyonrails rails