--- layout: post title: Relationships in Rails 2.3 tags: - Development - rails status: publish type: post published: true meta: _edit_last: '1' --- Ruby on Rails is becoming quite a piece of software. I've been learning how to work with its latest version to date, 2.3, for a series of workshops on web development. It has surprised me how easy it is now to accomplish a simple task such as multi-model form processing. Let me show what I've been doing lately.

Case study: a school

The example I am going to show my attendees resembles a typical school situation. In a nutsheel: [caption id="attachment_78" align="alignnone" width="442" caption="Rails relationships — student"]Rails relationships — student[/caption]

The Models

Student

class Student < ActiveRecord::Base
   has_many :grades
   has_many :subjects, :through => :grades, :uniq => true
   accepts_nested_attributes_for :grades, :allow_destroy => true
end

Subject

class Subject < ActiveRecord::Base
  validates_uniqueness_of :shortname
  has_many :grades
  has_many :students, :through => :grades, :uniq => true
end

Grade

class Grade < ActiveRecord::Base
  belongs_to :subject
  belongs_to :student
  validates_presence_of :value
end

And the magic trick!

Through accepts_nested_attributes_for, the student's form_for can now accept nested fields through fields_for for setting Grades' data. Everytime a student is created, subjects are not directly associated to him. You need to create a form in which you allow to assign a student the subjects you want. [image missing] This tells you that a student can have an array of subject id's. You even get to see what subjects are already assigned and dissociate them just like that! When the associations are done, a new Grade record is created to associate the first two modules. Unfortunately, when the associations are dismantled, the Grade association is gone too. If you know Railscasts, the Complex Forms series explain this task for Rails < 2.3. But now it has become easier and easier to associate models and worrying less about your structure.