rails: 多对多关联-自定义关联表(has_and_belongs_to_many)
关联has_and_belongs_to_many
与另一个模型建立直接的多对多关系,无需中间模型。此关联表示声明模型的每个实例都引用另一个模型的零个或多个实例。
例如,考虑一个具有Assembly
和Part
模型的应用程序,其中每个组件可以包含多个部件,并且每个部件可以在多个组件中使用。您可以按如下方式设置模型:
01 换一个常见的场景
我们可以使用“学生(Student)”和“课程(Course)”的多对多关系作为例子。以下是如何在 Rails 中实现这一过程的步骤:
02 生成模型
首先,使用 Rails 生成 Student
和 Course
模型:
rails g model Student name:string
rails g model Course title:string
03 生成连接表(关系表)
然后,生成一个连接表,名为 courses_students
,用于建立 students
和 courses
之间的多对多关系:
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.rb
和 app/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