按照Rails中的产品计数对商店进行排序

时间:2017-10-10 03:34:11

标签: ruby-on-rails postgresql activerecord

我正在尝试按照每个商店内的产品数量来订购商店列表。我在商店和产品之间加入了所有权。所以我的模型看起来像:

shop.rb

has_many :ownerships
has_many :products, through: :ownerships

product.rb

has_many :ownerships
has_many :shops, through: :ownerships

ownership.rb

belongs_to :product
belongs_to :shop

如何通过计数来调整此查询?

@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

2 个答案:

答案 0 :(得分:0)

我在我的网站上试过了我认为我们这个问题只是因为PG小组请试试这个:

Shop.all.joins(:products).select('products.*').where.not(products: {id: nil}).references(:products).group('products.id')

答案 1 :(得分: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')

ActiveRecord FTW。