2017-10-10 10 views
0

各ショップ内の商品数でショップのリストを注文しようとしています。所有権であるショップと商品の中間に参加しています。商品を店舗で並べ替える

どうやって注文するの周りにこのクエリを回すでしょう

belongs_to :product 
belongs_to :shop 

ownership.rb

shop.rb

has_many :ownerships 
has_many :products, through: :ownerships 

product.rb

has_many :ownerships 
has_many :shops, through: :ownerships 

:だから、私のモデルは次のようになりカウントによる製品?

@shops = Shop.all.includes(:products).where('products.id IS NOT NULL').references(:products).order(id :desc) 

私のような.group('id').order('count(*) DESC')のバリエーション試してみた:

@shops = Shop.all.includes(:products).where('products.id IS NOT NULL').references(:products).group(:id).order('count(*) DESC') 

をしかし、私は、私が思うに、私のサイト上でそれを試してみました

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "products.id" must appear in the GROUP BY clause or be used in an aggregate function 
+3

[Rails 3の可能な重複](一致する件数順)(多対多)](https://stackoverflow.com/questions/16834399/rails-3-order-by-count-of-matches-many- to-many) – Genzume

+0

上記は私に同じPG :: GroupingErrorを与えています。 'Shop.all.sort_by {| s | s.products.count} 'は実際には動作しますが、かなり遅いです。 – albaba

+0

何を数えますか?ユニークな製品の数またはすべての製品の総在庫数、または特定の製品の数です。 – max

答えて

0

のようなエラーを回避するために見えることはできませんPGグループのためにこの問題を試してみてください:

+0

これはとても近いですが、これはインスタンスではなく製品を注文しているようですが、オブジェクトヘッダーとして '#<インスタンス:0x007fe211333858 'のように戻ってきますが、最初の属性は' id:520685 'は有効なインスタンスIDではなく、プロダクトID – albaba

0

誰かが同じことに遭遇した場合に備えてこれを考え出します。

の回答/コメントのすべてが超接近していたが、ものが降順にほとんどの製品を持っていたことにより、ソートされた店舗を得るために、私が使用:

@stores = Store.joins(:products).group('stores.id').order('count(products.id) desc') 

を店舗が持っていたどの検索しようとして特定のブランドのほとんどの製品が降順でソートされていますが、私は上記を使用するように変更しました:

@stores = Store.joins(:products).group('stores.id').where(:products => { :brand_id => @brand.id }).order('count(products.brand_id) desc') 

アクティブレコードFTW。

関連する問題