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(商品一覧)
ruby
1@q = **************.ransack(params[:q]) 2@products = @q.result(distinct: true).page(params[:page])
(→@productsはviewで商品一覧表示に使う)
で、この****に入れるべきプログラムがわかりません。
(やりたいことはこんな↓感じのことです)
ruby
1@q = [] 2Product.find_each do |product| 3 if product.seller[0].school = "○○高校" 4 @q << product 5 end 6end
しかしながら、複数の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]的表現をどこに入れるべきか?
・今回の場合、効率の良い取り方はどのようなものでしょうか?
お詳しい方、ぜひともご教授ください????よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/13 06:26 編集
2017/11/22 03:48