Lets say I have two databases: one for students and one for classes. I would like to be able to 'add' classes to a specific student and also be able to add students to a specific class. I assume I need to use a join table here but I am a little lost on how to use them. I would ultimately like to be able to do something like:
@class.students.find(@student_id)
and this would tell me if the student is in the class or not. I know the relationship between classes and students is 'has_many' and vice versa. Does doing 't.references :students' in the migrate files accomplish that? I tried adding that line to my migrate file and then tried finding something using the statement above and it gave me an error. I am new to RoR so I am not even sure what the best way to go about achieving this is. Any help is appreciated!
Ruby on Rails ActiveRecord Query Interface Joins joins() allows you to join tables to your current model.
:joins uses inner join, :includes uses outer join. the main reason of :includes is eager loading, to avoid the N+1 problem of loading in attributes of each object using a separate query.
A join table is a data table that has multiple outgoing connections - connecting multiple data tables to one data table. This will make sense in a minute, hang on.
Everything true what @Jordan said, here the concrete steps to take:
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 end end
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_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
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_id end
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With