Menu

Category

Archive

logo


多対多の関係の構築 [ Ruby on Rails]

2013-12-07 07:00:00 +0900
  • このエントリーをはてなブックマークに追加

Ruby on Rails での多対多の関係の作り方。なぜか初めてやったとき尋常なくハマってしまったので。多対多とは、例えば、アイテムモデルがカテゴリに属し、さらにいくつかのカテゴリに属す可能性がある時のような関係です。

中間モデルの作成

この多対多の関係を作成するには、まず、中間モデルを作成し、この中間モデルがそれぞれのレコードで対応するアイテムとカテゴリを保存しておきます。そのため、まず下記のようにその中間モデルを作ります。

1 $ rails g migration CreateCategoryItems
 1 # 生成されたマイグレーションファイル
 2 class CreateCategoryItems < ActiveRecord::Migration
 3   def change
 4     create_table : category_items do |t|
 5       t.integer :item_id, :null=> false;
 6       t.integer :category_id, :null=> false;
 7  
 8       t.datetime :create_at
 9       t.datetime :update_at
10     end
11   end
12 end
1 # その中間モデルファイルも作成
2 class CategoryItem < ActiveRecord::Base
3   belongs_to :item
4   belongs_to :category
5 end

各モデルの関連付け

上記のように中間モデルを作成したら、次は具体的な多対多の関係になる2つのモデルを関連付けていきます。

1 # item.rb
2 # Relationship with Category
3   has_many :category_items 
4   has_many :categories, :through => :category_items
1 # major.rb
2 # Relationship with Item
3   has_many :category_items 
4   has_many :items, :through => :category_items

これだけで多対多のモデル関係ができました。実際に成功したか確認するには、コンソールで、下記のように入力し、エラーがでなければ大丈夫でしょう。マイグレーションを適応するのを忘れずに。

1 $ rails c 
2 $ i = Item.first
3 $ i.categories.count