Rails で商品とカテゴリ

商品とカテゴリ

Ruby on Rails で販売しない EC サイトを作ってみた - div1に上がりたいkeitanxkeitanの日記 で作った EC サイトの改良。
商品ごとにカテゴリを設定して、カテゴリごとに商品を一覧できるようにしたい。
管理者がカテゴリを追加したり削除したりできるようにしたいので、カテゴリはモデルということになる。
今回は商品ごとにカテゴリを設定できるようにするところまで。

結論から書くとカテゴリと商品とを has_many, belongs_to 関係とで関連付けた。
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう の第10章に詳しい。

手順

Product モデルは既にあるので、Category モデルを作る。

$ rails generate model Category name:string

Product モデルと Category モデルとを関連付けるためのマイグレーションを作成。

$ rails generate migration AddCategoryIdToProducts

category_id を追加。

class AddCategoryIdToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :category_id, :integer
    add_index :products, :category_id
  end

  def self.down
    remove_index :products, :column => :category_id
    remove_column :products, :category_id
  end
end

マイグレート。

$ bundle exec rake db:migrate

あとは関連付けを行うだけ。

商品がカテゴリに所属する (belongs_to) 関連付け。

class Product < ActiveRecord::Base
  belongs_to :category
  .
  .
  .
end

カテゴリが商品を複数所有する (has_many) 関連付け。

class Category < ActiveRecord::Base
  has_many :products
  .
  .
  .
end

has_many, belongs_to による関連付けを RailsAdmin がよしなに扱ってくれる

RailsAdmin でいくつかカテゴリを追加してから、商品の編集画面を見てみると

f:id:keitanxkeitan:20140529002914p:plain

となっていていい感じ。
ちなみに RailsAdmin の設定で編集画面をカスタマイズしている場合は

  rails_admin do
    edit do
      .
      .
      .
      field :category # category_id ではないので注意!
    end
  end

と記述しておけば OK。