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

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

ただいまの
回答率

90.52%

  • Ruby on Rails

    7264questions

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

  • SQL

    2391questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Active Record

    231questions

    Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

関連テーブルに条件を付けて検索したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 676

taremimi_7

score 14

Ruby on Railsで、ユーザが出品、または購入ができるシステムを作っています。
その中で、出品したユーザの属性(ここでは学校)を判別し、各学校に依存した商品一覧を表示しようと考えています。具体的には、商品(product)を出品したユーザ(seller)の学校(school)が"○○高校"の場合に限り、商品の情報を取得するというものです。(whereやjoins等々を使って効率よく)

app/model/user.rb(ユーザモデル)

has_many :orders_of_seller, :class_name => 'Order' ,:foreign_key => 'seller_id
has_many :orders_of_buyer, :class_name => 'Order' , :foreign_key => 'buyer_id'
has_many :products_of_seller, :through => :orders_of_seller, :source => 'product'
has_many :products_of_buyer, :through => :orders_of_buyer, :source => 'product'  


userカラム:  school: string

app/model/order.rb(注文モデル)

belongs_to :seller, :class_name => 'User'  ,   optional: true
belongs_to :buyer, :class_name => 'User',   optional: true
belongs_to :product,   optional: true


orderカラム:  
product_id: integer
buyer_id: integer
seller_id: integer

app/model/product.rb(商品モデル)

has_many :order, dependent: :destroy
has_many :seller, :through => :order
has_many :buyer, :through => :order 


productカラム:  
user_id: integer

app/controllers/products_controller.rb(商品一覧)

@q = **************.ransack(params[:q])
@products = @q.result(distinct: true).page(params[:page])

(→@productsはviewで商品一覧表示に使う)

で、この****に入れるべきプログラムがわかりません。
(やりたいことはこんな↓感じのことです)

@q = []
Product.find_each do |product|                                                            
 if product.seller[0].school = "○○高校"
  @q << product
 end
end

しかしながら、複数のbuyerが存在する仕様のため、sellerは1人しかいませんが、売り手はseller[0]としなければいけません。

以上を踏まえて下記のようにそれっぽい(ぜんぜんそれっぽくない)挑戦をしましたが、うまくいきませんでした。

@q = Product.includes(:seller).where(seller: {school: "○○高校" }).references(:seller)
@q = Product.joins(order: :seller).where(orders: {seller_id: *} ,sellers: {school: "○○高校"}).references(:seller)
@q = Product.eager_load(:seller).where(seller: {school: "○○高校" }) 


・seller[0]的表現をどこに入れるべきか?
・今回の場合、効率の良い取り方はどのようなものでしょうか?

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

@q = Product.joins(order: :seller).where(orders: {seller_id: *} ,sellers: {school: "○○高校"}).references(:seller)


この行についてですがこちらのサイトが参考になるかと思います。
おそらく、sのつけ方に問題があるのではないでしょうか?
http://easyramble.com/rails-multi-tables-joins-includes-where.html

もう一つ、sellers[0]の件ですが、
Product.sellersとするのではなく
@sellerの中に特定のseller(単数)を入れて
@seller.products.each do |product|
として、eachするのはいかがでしょうか?

ご検討のほどよろしくお願いします。
ご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/13 15:25 編集

    @junya451054 様 コメントありがとうございます。紹介して頂いたサイトと、アドバイスを元に、app/models/product.rbにbelongs_to :user #出品者 を付け、コントローラにスコープを定義することで解決しました。(seller,buyerとは別のヒモ付け(事実上sellerのuser_id)を発生させてので、本質的な解決にはなっていませんが、意図していた事はできました(恐らく原因はモデルでorder"s"だとかseller"s"だとかのs関係かと思われるので今後対応していこうとおもいます))
    誠にありがとうございました。

    キャンセル

  • 2017/11/22 12:48

    お力になれたようで何よりです。
    私もちょうど同じようなことをやっていましたので、勉強になりました。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    7264questions

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

  • SQL

    2391questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • Active Record

    231questions

    Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。