自宅の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つ実装します。今回は、多対多同士のふたつのコントローラーの実装例を紹介します。
・ProductsControllerclass 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の標準機能であり、使いやすいインターフェースを提供しています。
今回の実装では、商品と業者の多対多の関係性を中間テーブルを使って実現し、商品と業者のコントローラーを実装しました。
これにより、商品と業者の情報を容易に登録、編集、削除することができるようになりました。
最後に、多対多の関係性は現実にある多くのデータベースにおいて、非常に重要な関係性であり、多くの場合、中間テーブルを使って実現されます。
したがって、中間テーブルの理解は、データベースの設計や実装において必要不可欠なスキルであると言えます。
次回は、もう一つのコントローラーの実装と、ビューを実装していきます。
今回も、ありがとうございました。