From 3204575bfcd1f12db5945c8959073d40915cfdfe Mon Sep 17 00:00:00 2001 From: José Mota Date: Fri, 6 Apr 2012 19:40:37 +0100 Subject: Import all posts. --- _posts/2009-04-30-relationships-in-rails-2-3.html | 54 +++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 _posts/2009-04-30-relationships-in-rails-2-3.html (limited to '_posts/2009-04-30-relationships-in-rails-2-3.html') diff --git a/_posts/2009-04-30-relationships-in-rails-2-3.html b/_posts/2009-04-30-relationships-in-rails-2-3.html new file mode 100644 index 0000000..aba204d --- /dev/null +++ b/_posts/2009-04-30-relationships-in-rails-2-3.html @@ -0,0 +1,54 @@ +--- +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. -- cgit v1.2.3-54-g00ecf