#やりたいこと
ユーザー(User(seller,buyer))、注文(Order)、商品(Product)、3者間のリレーション定義です。
以下の参考サイトと目指すリレーションはほぼ同じですが、1つの商品に紐づく購入者モデルと注文モデルが一意に決まらないところが異なります。
参考サイト
具体的には1つの商品に対して複数人からの注文を想定しているため、商品の出品と同時に出品者は商品モデルインスタンスと注文モデルインスタンスを作成し、購入の申請と同時に購入者は商品に紐づいた追加の注文モデルインスタンスを作成する仕様です。
上記の関連条件下でレコードのビルド(出品)と3モデル内でdependent:destroyの削除ができるようにしたいです。
##環境
MacOS
Ruby 2.2.3
Rails 5.1.4
##現状:コード
Model
ruby
1class User < ApplicationRecord 2 has_many :orders_of_sellers, :class_name => 'Order' ,:foreign_key => 'seller_id',dependent: :destroy 3 has_many :orders_of_buyers, :class_name => 'Order' , :foreign_key => 'buyer_id',dependent: :destroy 4 has_many :products_of_sellers, :through => :orders_of_sellers, :source => 'product',dependent: :destroy 5 has_many :products_of_buyers, :through => :orders_of_buyers, :source => 'product',dependent: :destroy 6 has_many :products, dependent: :destroy 7end
ruby
1class Order < ApplicationRecord 2 belongs_to :seller, :class_name => 'User' , optional: true 3 belongs_to :buyer, :class_name => 'User', optional: true 4 belongs_to :product, optional: true 5end 6 7migrate.rb 8 t.integer :product_id 9 t.integer :buyer_id 10 t.integer :seller_id
ruby
1class Product < ApplicationRecord 2 has_many :orders, dependent: :destroy 3 has_many :sellers, :through => :orders 4 has_many :buyers, :through => :orders 5end
Product Controller
ruby
1~~~~~ 2def create 3 @user = User.find_by(id: current_devise_user.id) 4 @product = @user.products_of_sellers.build(product_params) 5 if @product.save 6 flash.now[:success] = "出品しました" 7 redirect_to products_path 8 else 9 render :new 10 end 11end 12~~~~
##現状:出品した後の挙動
出品した後にProductモデルからUser(Seller)モデルを特定できません。
つまり、
・Userモデルインスタンスを削除してもProductモデルインスタンスやOrderモデルインスタンスが残っている。
・Productモデルインスタンスを削除してもOrderモデルインスタンスが残っている。
というように、3モデル内でdependent:destroyが動きません。
pry(main)> Product.find(1).seller
Product Load (0.4ms) SELECT
products
.* FROMproducts
WHEREproducts
.id
= 1 LIMIT 1
NoMethodError: undefined method `seller' for #Product:0x007ff9b1b1caf8
Did you mean? sellers
sellers=
pry(main)> Product.find(1).sellers
Product Load (0.5ms) SELECT
products
.* FROMproducts
WHEREproducts
.id
= 1 LIMIT 1
User Load (0.5ms) SELECT users
.* FROM users
INNER JOIN orders
ON users
.id
= orders
.seller_id
WHERE orders
.product_id
= 1
[]
##補足
1つの商品モデルインスタンスとそれに紐づく複数の注文モデルインスタンスに対して、User(Seller)モデルインスタンスは一意が望ましいのですが、User(buyer)のリレーション定義と帳尻を合わせる(?Productモデルでhas_one :sellerとかにすると色々と動かなくなった)ためhas_many :sellersとしています。ここを含めて改変のコードを提示していただけたらとても嬉しいです。
お詳しい方、ぜひともご教授ください???? よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。