自宅のWindowsでRuby on Rails ~データベース操作2

1. テーブル設計


以下のテーブル設計で実装していきます。

仕入帳

仕入帳テーブル:purchase_records
id: 仕入帳ID (bigint、主キー)
purchase_date: 仕入日 (date)
quantity: 個数 (integer)
product_id: 商品ID (bigint、商品テーブルの外部キー)
supplier_id: 業者ID (bigint、業者テーブルの外部キー)

商品

商品テーブル:products
id: 商品ID (bigint、主キー)
name: 商品名 (string)
price: 単価 (integer)
stock: 在庫数(integer)

業者

業者テーブル:suppliers
id: 業者ID (bigint、主キー)
name: 業者名 (string)
tel: 業者電話番号 (string)

2. 準備


1.まず、ターミナルで新しいRailsアプリケーションを作成します。

rails new stockin -d mysql

ここではmysqlを使用するstockinというアプリケーションを作成しています。

2.データベースを作成します。

cd stockin
rails db:create

3.次に、必要なモデルを生成します。

rails g model PurchaseRecord purchase_date:date quantity:integer product_id:bigint supplier_id:bigint
rails g model Product name:string price:integer stock:integer
rails g model Supplier name:string tel:string
rails g model SupplierProduct supplier:references product:references

4.マイグレーションを実行して、データベースにテーブルを作成します。

rails db:migrate

5.コントローラーを生成します。

rails g controller PurchaseRecords
rails g controller Products
rails g controller Suppliers


3. 実装


1.ルーティングを設定します。

Rails.application.routes.draw do
  root 'purchase_records#index'
  resources :products
  resources :suppliers
  resources :purchase_records
end<

2.それぞれのモデルにアソシエーションを設定します

# purchase_record.rb
class PurchaseRecord < ApplicationRecord
  belongs_to :product
  belongs_to :supplier
end

# product.rb
class Product < ApplicationRecord
  has_many :supplier_products
  has_many :purchase_records
  has_many :suppliers, through: :supplier_products
end

# supplier.rb
class Supplier < ApplicationRecord
  has_many :purchase_records
  has_many :supplier_products
  has_many :products, through: :supplier_products
end

#supplier_product.rb
class SupplierProduct < ApplicationRecord
  belongs_to :supplier
  belongs_to :product
end<

3.コントローラーを3つ実装します。今回は、多対多同士のふたつのコントローラーの実装例を紹介します。

・ProductsController

class ProductsController < ApplicationController

  def index
    @products = Product.all
  end

  def show
    @product = Product.find(params[:id])
    @suppliers = @product.suppliers
  end

  def new
    @product = Product.new
    @suppliers = Supplier.all # 業者のリストを取得
  end

  def edit
    @product = Product.find(params[:id])
    @suppliers = Supplier.all # 業者のリストを取得
  end

  def create
    @product = Product.new(product_params)
    supplier_ids = params[:product][:supplier_ids].reject(&:empty?)
    @product.suppliers << Supplier.find(supplier_ids)
    if @product.save
 &

4. まとめ

今回は、一対多、多対多の関係性を持つテーブル設計と、実装の準備、そして多対多同士のコントローラーをふたつ実装しました。

多対多同士のテーブルの関連付けも非常に簡単に実装可能で、一方の関連を削除すると自動的に他方の関連も削除されます。

これを可能にしているのが、中間テーブルというものでした。今回の実装では、SupplierProductモデルがそれにあたります。


中間テーブルには、その関係性に関する情報を格納することができます。

例えば、ある業者がある商品を扱う場合に、中間テーブルにはその業者がその商品を扱っている期間や、価格帯などの情報を保存することができます。

そして、実際にデータベースを操作する際には、RailsのActive Recordを使うことで、複雑なSQL文を書く必要がありません。

また、Active RecordはRailsの標準機能であり、使いやすいインターフェースを提供しています。

今回の実装では、商品と業者の多対多の関係性を中間テーブルを使って実現し、商品と業者のコントローラーを実装しました。

これにより、商品と業者の情報を容易に登録、編集、削除することができるようになりました。


最後に、多対多の関係性は現実にある多くのデータベースにおいて、非常に重要な関係性であり、多くの場合、中間テーブルを使って実現されます。

したがって、中間テーブルの理解は、データベースの設計や実装において必要不可欠なスキルであると言えます。

次回は、もう一つのコントローラーの実装と、ビューを実装していきます。


今回も、ありがとうございました。