--- layout: post title: Relationships in Rails 2.3 tags: [ development, rails ] type: post published: true --- 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: * Students have Subjects. * Subjects have Students. * Students have Grades to Subjects. ![Rails relationships — student](/wp-content/uploads/2009/07/rails-relationships-student.png) ## The Models ### Student {% highlight ruby %} class Student < ActiveRecord::Base   has_many :grades   has_many :subjects, :through => :grades, :uniq => true accepts_nested_attributes_for :grades, :allow_destroy => true end {% endhighlight %} ### Subject {% highlight ruby %} class Subject < ActiveRecord::Base validates_uniqueness_of :shortname has_many :grades has_many :students, :through => :grades, :uniq => true end {% endhighlight %} ### Grade {% highlight ruby %} class Grade < ActiveRecord::Base belongs_to :subject belongs_to :student validates_presence_of :value end {% endhighlight %} ## 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](http://railscasts.com/episodes?search=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.