質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

1403閲覧

has_many :through の関連で同一モデルを含む場合

taremimi_7

総合スコア20

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/12/23 05:02

編集2017/12/23 05:04

#やりたいこと
ユーザー(User(seller,buyer))、注文(Order)、商品(Product)の3者間でのリレーションの定義です。
1つの商品に対して複数人からの注文に対応できる状態を想定しているため、
出品者は商品の出品と同時に商品モデルと注文モデルを作り、
購入者は購入の申請と同時に商品に紐づいた追加の注文モデルを作る仕様です。

以下の参考サイトとほぼ同じですが、1つの商品に対して購入者及び注文モデルが一意に決まらないところが異なります。
参考サイト

上記の関連条件下でレコードのビルド(出品)及びdependent:destroyの削除が効くまでの確認がしたいです(コンソールからでも可)。

##環境
MacOS
Ruby 2.23
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モデルから出品者を特定できない

pry(main)> Product.find(1).seller

Product Load (0.4ms) SELECT products.* FROM products WHERE products.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.* FROM products WHERE products.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
[]

  • リストUserモデルを削除してもProductモデルやOrderモデルが残っている。
  • リストProductモデルを削除してもOrderモデルが残っている。

##補足
1つの商品モデルと複数の注文モデルに対して、出品者(seller)は一意が望ましいのですが、購入者(buyer)のリレーションと帳尻を合わせる(?Productモデルでhas_one :sellerとかにすると色々と動かなくなった)ためhas_many :sellersとしています。ここを含めて改変のコードを提示していただけたらとても嬉しいです。

お詳しい方、ぜひともご教授ください???? よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問