Ruby on Rails での多対多の関係の作り方。なぜか初めてやったとき尋常なくハマってしまったので。多対多とは、例えば、アイテムモデルがカテゴリに属し、さらにいくつかのカテゴリに属す可能性がある時のような関係です。
中間モデルの作成
この多対多の関係を作成するには、まず、中間モデルを作成し、この中間モデルがそれぞれのレコードで対応するアイテムとカテゴリを保存しておきます。そのため、まず下記のようにその中間モデルを作ります。
1 | $ rails g migration CreateCategoryItems
|
1
2
3
4
5
6
7
8
9
10
11
12 | # 生成されたマイグレーションファイル
class CreateCategoryItems < ActiveRecord::Migration
def change
create_table : category_items do |t|
t.integer :item_id, :null=> false;
t.integer :category_id, :null=> false;
t.datetime :create_at
t.datetime :update_at
end
end
end
|
1
2
3
4
5 | # その中間モデルファイルも作成
class CategoryItem < ActiveRecord::Base
belongs_to :item
belongs_to :category
end
|
各モデルの関連付け
上記のように中間モデルを作成したら、次は具体的な多対多の関係になる2つのモデルを関連付けていきます。
1
2
3
4 | # item.rb
# Relationship with Category
has_many :category_items
has_many :categories, :through => :category_items
|
1
2
3
4 | # major.rb
# Relationship with Item
has_many :category_items
has_many :items, :through => :category_items
|
これだけで多対多のモデル関係ができました。実際に成功したか確認するには、コンソールで、下記のように入力し、エラーがでなければ大丈夫でしょう。マイグレーションを適応するのを忘れずに。
1
2
3 | $ rails c
$ i = Item.first
$ i.categories.count
|