多対多の関係テーブル

テーブルa (例えば People) と テーブルb (例えば Organizations)が多:多の関係をもっているときに、
関係テーブル a_b ( 例えば organizations_people ) をもちこむことで、関連を定義できます。

 create table people (
   id serial,
   name varchar, 
 );
 create table organizations (
   id serial,
   name varchar,
 );
 crate table organizations_people (
   person_id int,
   organization_id int,
   constraint fk_op foreign key (person_id) references people(id),
   constraint fk_op foreign key (organizatiotion_id) references organizations(id),
   primary key (person_id, organization_id)
 );

クラス定義(単数形と複数形に要注意)

 class Person < ActiveRecord::Base
   has_and_belongs_to_many :organizations
 end

 class Organization < ActiveRecord::Base
   has_and_belongs_to_many :people
 end

has_and_belongs_to_many は長いので 「habtm」と呼びます。

関係テーブルにセットするのにしばらく悩みました。が次のようにして
Railsメソッドが裏でセットしてくれることがやっと判明。解決!

    pr = Person.new { |p|
      p.name   = 'FUKUI'           #個人名
    }
    pr.save
    
    og = Organization.new { |o|
      o.name   = 'iTest'           #組織名
    }
    og.save
    
    # 組織_個人関係organizations_people登録
    og.people << pr

↑↑↑↑↑↑↑↑

わかってみれば、実に美しい! すごいね Rails