Ruby on rails 在RubyonRails中使用联接表
假设我有两个数据库:一个用于学生,一个用于班级。我希望能够为特定的学生“添加”课程,也能够为特定的课程添加学生。我假设我需要在这里使用联接表,但我对如何使用它们有点迷茫。我最终希望能够做到以下几点:Ruby on rails 在RubyonRails中使用联接表,ruby-on-rails,ruby,join,Ruby On Rails,Ruby,Join,假设我有两个数据库:一个用于学生,一个用于班级。我希望能够为特定的学生“添加”课程,也能够为特定的课程添加学生。我假设我需要在这里使用联接表,但我对如何使用它们有点迷茫。我最终希望能够做到以下几点: @class.students.find(@student_id) 这会告诉我这个学生是否在课堂上。我知道班级和学生之间的关系是“有很多”,反之亦然。迁移文件中的“t.references:students”是否可以实现这一点?我尝试将该行添加到我的migrate文件中,然后尝试使用上面的语句
@class.students.find(@student_id)
这会告诉我这个学生是否在课堂上。我知道班级和学生之间的关系是“有很多”,反之亦然。迁移文件中的“t.references:students”是否可以实现这一点?我尝试将该行添加到我的migrate文件中,然后尝试使用上面的语句查找某些内容,但它给了我一个错误。我是RoR新手,所以我甚至不确定实现这一目标的最佳方式是什么。感谢您的帮助 是的,这是一种多对多的关系(班级有很多学生,学生有很多班级)。为此,您将使用
has\u many:through
关系。请查看的文档(Ctrl-F表示“关联-连接模型”)
在迁移中,
t.references:students
是指定所属关系的方式,因为它只添加了一个student\u id
列(该列只能容纳一个id,即一个学生)。然而,联接模型将有两列:student\u id
和class\u id
。(顺便说一句,在Ruby中调用模型“类”是自找麻烦。我是否可以建议使用“当然”?)一切都是真实的@Jordan所说的,下面是具体的步骤:
创建: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
现在,您可以使用方法所属的和有许多生成的方法:
@course.students
@student.courses
试着在中找到所有相关的事实和片段,在那里你应该可以找到所有你需要的信息,以便走上正轨。祝你好运 这是一个老问题,但万一有人像我一样偶然发现了这个问题,你现在可以拥有关系has\u和\u belient\u to \u many
。因此,可以创建一个联接表:
create_join_table :students, :courses do |t|
t.integer :student_id
t.integer :course_id
end
然后在模型中,你会说一个学生拥有并且属于很多:课程
一门课程有很多学生,而且属于很多学生。没有必要再上第三堂课叫CourseStudent。这里有所有这些信息你能发布你的学生、班级和加入模型的代码吗?课程学生所属不应该是一个符号。请投票!太神了帮帮我!较新版本的rails将此用于迁移:t.integer:student\u id
t.integer:course\u id
如果您使用的是has\u and\u belies\u to\u many
关系,您还应该在迁移create\u表中包含参数id:false
,因为您没有用该表表示模型。如果您希望表示一个模型,建议您使用has\u many to:
关联。您还可以在迁移中使用create\u join\u table
,这将不需要显式添加id:false
参数。(正如StephanieS所解释的)实际上create\u join\u table
会自动为您创建两个id字段。。。您可以将该块用于其他字段,也可以将该块用于比@AlexChaffee更进一步的索引,当我将这些id规范包括在该块中时,将引发一个错误。(我在轨道6上。)一个人根本不需要一个街区。我想你的意思是“假设我有两张桌子”。你能澄清一下吗?
create_join_table :students, :courses do |t|
t.integer :student_id
t.integer :course_id
end