Railsで 「お客様の商品次回購入時期を表示する」 システムを作っています。
・Salonテーブル:ログインユーザー
→カラム:id, name, email
・Userテーブル:購入者情報登録済み
→カラム:id, number, name, email, salon_id
・Productテーブル:商品情報登録済み
→カラム:id, number, brand, name, term, salon_id
・Purchaseテーブル:フォームより入力
→カラム:id, user_number, product_number, salon_id
中間テーブル(Purchase)を作成し、登録済みのuser_numberとproduct_numberを
form入力をして紐づくデータをUserテーブル,Productテーブルから取得して一覧表示という機能を実装しました。
userとproductそれぞれでの一覧表示においてはログインユーザーの登録データのみを表示出来ておりますが、
上述の中間テーブルであるpurchaseにおいては別のログインユーザーの保存したデータを表示される可能性があります。
ログインユーザーごとにそれぞれuser,productテーブルに任意のnumberが入力でき、DB上でnumberの重複を許容した上でどのような処理をすべきかご教授ください。
よろしくお願い致します。
【purchase html.erb】
<div class="purchase_index"> <h1>購入商品一覧</h1> <table class="table"> <thead> <tr> <th>お客様No.</th> <th>お客様名</th> <th>ブランド</th> <th>商品名</th> <th>購入日</th> <th>残り日数</th> <th colspan="2"></th> </tr> </thead> <tbody> <% @purchases.each do |purchase| %> <tr> <td><%= purchase.user_number %></td> <td><%= purchase.user.name %></td> <td><%= purchase.product.brand %></td> <td><%= purchase.product.name %></td> <td><%= purchase.created_at.strftime('%Y/%m/%d') %></td> <td><%= purchase.product.term - (Date.today - purchase.created_at.to_date).to_i %></td> <td><%= purchase.user.email %></td> <td><%= link_to "削除", purchase, method: :delete, class:"btn btn-primary mr-3" %></td> <% end %> <tr> </tbody> </table> </div> <div class="purchase_form"> <h2>購入情報登録</h2> <%= form_for(@purchase) do |f| %> <%= f.label :user_number %> <%= f.number_field :user_number, class: 'form-control' %> <%= f.label :product_number %> <%= f.number_field :product_number, class: 'form-control' %> <%= f.submit "購入情報登録", class: "btn btn-primary" %> <% end %> </div> </div>
【purchase controller】
class PurchasesController < ApplicationController def index @purchases = Purchase.where(salon_id: current_salon.id) @purchase = Purchase.new end def create @purchase= Purchase.new(purchase_params.merge(salon_id: current_salon.id)) if @purchase.save flash[:success] = "Success!" redirect_to "/purchases" else redirect_to "/purchases" end end def edit @purchase=Purchase.find(params[:id]) end def update purchase=Purchase.find(params[:id]) purchase.update(purchase_params) redirect_to "/purchases" end def destroy Purchase.find(params[:id]).destroy flash[:success]= "deleted" redirect_to "/purchases" end private def purchase_params params.require(:purchase).permit(:user_number, :product_number) end end
【purchase model】
class Purchase < ApplicationRecord belongs_to :user, optional: true, foreign_key: :user_number belongs_to :product, optional: true, foreign_key: :product_number belongs_to :salon end
【user model】
class User < ApplicationRecord validates :name, presence: true, length: { maximum: 50 } validates :number, presence: true has_many :purchases, foreign_key: :user_number has_many :products, through: :purchases belongs_to :salon end
【product model】
class Product < ApplicationRecord validates :brand, presence: true validates :number, presence: true validates :name, presence: true validates :term, presence: true has_many :purchases, foreign_key: :product_number has_many :users, through: :purchases belongs_to :salon end
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。