在 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_tohas_many 生成的方法:

@course.students @student.courses

尝试在Rails Guides 中找到所有相关的事实和sn-ps,在那里你应该找到所有你需要的信息。祝你好运!

【讨论】:

CourseStudent belongs_to 不应是符号。 投票!惊人的!帮助了我! 较新版本的 rails 使用它进行迁移:t.integer :student_idt.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_idclass_id。 (顺便说一句,在 Ruby 中调用模型“Class”是自找麻烦。我可以建议“Course”吗?)

【讨论】:

您可以发布您的学生、班级和加入模型的代码吗?

以上是关于在 ruby​​ on rails 中使用连接表的主要内容,如果未能解决你的问题,请参考以下文章

ruby Ruby on Rails是左外连接

你好 postgres 数据库连接错误 Ruby on rails

ruby on rails 连接条件(带 squeel)

Ruby on Rails 为 SSL 连接正确配置法拉第 http 客户端

分析 ruby​​ / ruby​​ on rails 应用程序

Ruby On Rails Heroku Postgres数据库SSL连接