在 ruby on rails 中使用连接表
Posted
技术标签:
【中文标题】在 ruby on rails 中使用连接表【英文标题】:Using join tables in ruby on rails 【发布时间】:2011-11-28 04:47:20 【问题描述】:假设我有两个数据库:一个用于学生,一个用于班级。我希望能够向特定学生“添加”课程,也能够将学生添加到特定课程。我假设我需要在这里使用一个连接表,但我对如何使用它们有点迷茫。我最终希望能够做类似的事情:
@class.students.find(@student_id)
这会告诉我学生是否在课堂上。我知道班级和学生之间的关系是“has_many”,反之亦然。在迁移文件中执行 't.references :students' 是否可以做到这一点?我尝试将该行添加到我的迁移文件中,然后尝试使用上面的语句查找某些内容,但它给了我一个错误。我是 RoR 的新手,所以我什至不确定实现这一目标的最佳方法是什么。任何帮助表示赞赏!
【问题讨论】:
我假设您的意思是“假设我有两个 表”。你能澄清一下吗? 【参考方案1】:@Jordan 所说的一切都是真实的,这里是要采取的具体步骤:
-
创建migration:
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 中找到所有相关的事实和sn-ps,在那里你应该找到所有你需要的信息。祝你好运!
【讨论】:
CourseStudent belongs_to 不应是符号。 投票!惊人的!帮助了我! 较新版本的 rails 使用它进行迁移:t.integer :student_id
t.integer :course_id
如果您使用has_and_belongs_to_many
关系,您还应该在迁移create_table
中包含参数id: false
,因为您不是用该表表示模型。如果您希望表示模型,则建议您使用 has_many through:
关联。您还可以在迁移中使用create_join_table
,这不需要您显式添加id: false
参数。 (由 StephanieS 解释)【参考方案2】:
这是一个老问题,但以防万一有人像我一样偶然发现这个问题,您现在可以拥有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拥有所有这些信息
【讨论】:
其实create_join_table
会自动为你生成两个id字段...你可以将块用于其他字段,也可以用于索引
为了比@AlexChaffee 更进一步,当我在块中包含这些 id 规范时,会引发错误。 (我在 Rails 6 上。)根本不需要块。【参考方案3】:
是的,这是一个多对多的关系(班级有很多学生,学生有很多班级)。为此,您将使用has_many :through
关系。查看ActiveRecord::Associations
的文档(Ctrl-F 表示“Association Join Models”)。
在迁移中,t.references :students
是您指定belongs_to
关系的方式,因为它只是添加了一个student_id
列(只能容纳一个ID,即一个学生)。但是,连接模型将有两列:student_id
和 class_id
。 (顺便说一句,在 Ruby 中调用模型“Class”是自找麻烦。我可以建议“Course”吗?)
【讨论】:
您可以发布您的学生、班级和加入模型的代码吗?以上是关于在 ruby on rails 中使用连接表的主要内容,如果未能解决你的问题,请参考以下文章
你好 postgres 数据库连接错误 Ruby on rails
Ruby on Rails 为 SSL 连接正确配置法拉第 http 客户端