在rails上使用ruby中的连接表

时间:2011-09-30 04:58:56

标签: ruby-on-rails ruby join

假设我有两个数据库:一个用于学生,一个用于课程。我希望能够为特定学生“添加”课程,并且能够将学生添加到特定课程。我假设我需要在这里使用连接表,但我对如何使用它们有点迷失。我最终希望能够做到这样的事情:

  @class.students.find(@student_id)

这会告诉我学生是否在课堂上。我知道班级和学生之间的关系是'has_many',反之亦然。在迁移文件中做't.references:students'能做到吗?我尝试将该行添加到我的迁移文件中,然后尝试使用上面的语句查找内容并且它给了我一个错误。我是RoR的新手,所以我甚至不确定实现这一目标的最佳方法是什么。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:65)

@Jordan所说的一切都是真的,这里采取具体步骤:

  1. 创建migrationrails g model CourseStudent为n:m关系创建连接模型,并迁移到相应的表。
  2. 编辑迁移文件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
    
  3. 运行迁移:rake db:migrate。因此,连接表现在应该存在于您的数据库中。

  4. 向模型中添加以下代码

    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
    
  5. 您现在可以使用方法belongs_tohas_many生成的方法:

    • @course.students
    • @student.courses

    尝试在Rails Guides中找到所有相关的事实和摘要,在那里您应找到所需的所有信息以便进入正轨。祝你好运!

答案 1 :(得分:15)

这是一个老问题,但万一有人像我一样偶然发现这个问题,你现在可以建立关系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包含所有这些信息

答案 2 :(得分:14)

是的,这是一个多对多关系(班级有很多学生,学生有很多班级)。为此,您将使用has_many :through关系。查看ActiveRecord::Associations的文档(Ctrl-F表示“关联连接模型”)。

在迁移过程中,t.references :students是您指定belongs_to关系的方式,因为它只会添加student_id列(只能容纳一个ID,即一个学生)。但是,连接模型将包含两列:student_idclass_id。 (顺便说一句,在Ruby中调用模型'Class'是在寻找麻烦。我可以建议'课程'吗?)