Using join tables in ruby on rails Using join tables in ruby on rails ruby ruby

Using join tables in ruby on rails


Everything true what @Jordan said, here the concrete steps to take:

  1. Create a migration: rails g model CourseStudent creates a join model for the n:m relation, and the migration to the corresponding table.
  2. Edit the migration file CreateCourseStudent so it contains the following:

    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  endend
  3. Run the migration: rake db:migrate. As a result, the join table should now exist in your database.

  4. Add to the models the following code

    class Course < ActiveRecord::Base  has_many :course_students  has_many :students, :through => :course_studentsendclass Student < ActiveRecord::Base  has_many :course_students  has_many :courses, :through => :course_studentsendclass CourseStudent < ActiveRecord::Base  belongs_to :student  belongs_to :courseend

You are now able to use the methods generated by the methods belongs_to and has_many:

  • @course.students
  • @student.courses

Try to find all the relevant facts and snippets in the Rails Guides, there you should find all information you need to get on track. Good luck!


This is an old question, but just in case anyone stumbles upon this like I did, you can now have the relationships has_and_belongs_to_many. So yes, you would create a join table:

create_join_table :students, :courses do |t|  t.integer :student_id  t.integer :course_idend

And then in the models, you would say that a student has_and_belongs_to_many :coursesAnd a course has_and_belongs_to_many :students. There is no need to make a third class called CourseStudent. This link has all this information


Yes, this is a many-to-many relationship (class has many students, student has many classes). For this you'll use a has_many :through relation. Take a look at the docs for ActiveRecord::Associations (Ctrl-F for "Association Join Models").

In a migration, t.references :students is how you would specify a belongs_to relation, as it just adds a student_id column (which can only accommodate one id, i.e. one student). A join model, however, will have two columns: student_id and class_id. (Incidentally, calling a model 'Class' in Ruby is asking for trouble. Might I suggest 'Course'?)