Using join tables in ruby on rails
Everything true what @Jordan said, here the concrete steps to take:
- Create a migration:
rails g model CourseStudent
creates a join model for the n:m relation, and the migration to the corresponding table. 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
Run the migration:
rake db:migrate
. As a result, the join table should now exist in your database.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 :courses
And 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'?)