質問: * Railsを学習するためにECサイトを制作しています * カート機能を持ったECサイトを想定しているのですが、カート内の仕様を想定したときにどういったテーブル設計にすべきかわからないポイントが一点あったのでご質問しました * カート内の未購入商品の商品情報が変更されたときに、ユーザにその変更を通知するような仕様を考えているのですが、その仕様を実現できるテーブル設計のあり方がわかりません * 以下のテーブル設計・モデル設計にどういった変更を加えるべきかアドバイスをいただけないでしょうか? #### <制約条件> ##### usersテーブル * プライマリーキー:id * その他制約 - ユーザ名(フィールド名:name, 型:string):30文字まで、null値許可しない - メールアドレス(フィールド名:email, 型:string):30文字まで、null値許可しない ##### addressesテーブル * プライマリーキー:id * その他制約 - 住所(フィールド名:address, 型:string):100文字まで、null値許可しない ##### productsテーブル * プライマリーキー:id * ユニークキー:title,descriotionの組み合わせが一意 * その他制約 - 商品名(フィールド名:title, 型:string):20文字まで、null値許可しない - 商品詳述(フィールド名:description, 型:text):500文字まで、null値許可しない - 商品画像URL(フィールド名:image_url, 型:string):null値許可しない - 価格(フィールド名:price, 型:intger):null値許可しない - 在庫数(フィールド名:stock_quantity, 型:intger):null値許可しない ##### cart_itemsテーブル * プライマリーキー:id * ユニークキー:user_id,product_idの組み合わせが一意 * 外部キー:user_idはusersテーブルの外部キーとなり、product_idはproductsテーブルの外部キーとなる * その他制約 - ユーザID(フィールド名:user_id, 型:intger):null値許可しない - 商品ID(フィールド名:product_id, 型:intger):null値許可しない - 購入希望数(フィールド名:quantity, 型:intger):null値許可しない ##### order_itemsテーブル * プライマリーキー:id * ユニークキー:user_id,product_id,order_idの組み合わせが一意 * 外部キー:user_idはusersテーブルの外部キーとなり、product_idはproductsテーブルの外部キーとなり、order_idはordersテーブルの外部キーとなる * その他制約 - ユーザID(フィールド名:user_id, 型:intger):null値許可しない - 商品ID(フィールド名:product_id, 型:intger):null値許可しない - 注文ID(フィールド名:order_id, 型:intger):null値許可しない - 価格(フィールド名:price, 型:intger):null値許可しない - 購入数(フィールド名:quantity, 型:intger):null値許可しない ##### ordersテーブル * プライマリーキー:id * その他制約 - 送付先住所(フィールド名:address, 型:string):null値許可しない #### <スクリプト> ``` class CreateUsers < ActiveRecord::Migration create_table :users do |t| t.string :name, limit: 30, null: false t.string :email, limit: 30, null: false t.timestamps null: false end end class CreateAddresses < ActiveRecord::Migration create_table :addresses do |t| t.string :address, limit: 100, null: false t.timestamps null: false end end class CreateProducts < ActiveRecord::Migration create_table :products do |t| t.string :title, limit: 20, null: false t.text :description, limit: 500, null: false t.string :image_url, null: false t.integer :price, null: false t.integer :stock_quantity, null: false t.timestamps null: false end t.index[title, descriotion], unique: true end class CreateCartItems < ActiveRecord::Migration create_table :cart_items do |t| t.belongs_to :user, null: false t.belongs_to :product, null: false t.integer :quantity, null: false t.timestamps null: false end t.index[user_id, product_id], unique: true end class CreateOrders < ActiveRecord::Migration create_table :cart_items do |t| t.belongs_to :user, null: false t.belongs_to :product, null: false t.belongs_to :order, null: false t.integer :price, null: false t.integer :quantity, null: false t.timestamps null: false end t.index[user_id, product_id, order_id], unique: true end class CreateOrders < ActiveRecord::Migration create_table :assignments do |t| t.string :address, null: false t.timestamps null: false end end class User < ActiveRecord::Base has_many :addresses has_many :cart_items has_many :purchasing_products, class_name: "Product", through: :cart_items has_many :order_items has_many :purchased_products, class_name: "Product", through: :order_items end class Address < ActiveRecord::Base belongs_to :user end class Product < ActiveRecord::Base has_many :cart_items has_many :purchasing_users, class_name: "User",through: :cart_items has_many :order_items has_many :purchased_users, class_name: "User",through: :order_items end class CartItem < ActiveRecord::Base belongs_to :user belongs_to :product belongs_to :order end class Order < ActiveRecord::Base has_many :order_items end ```
回答: カートに投入した時刻をもっておいて、商品情報にも更新日時をもっておいて、 カートに投入時刻より新しい更新がある商品が入っていたら通知とか、どうでしょう。