【问题标题】:Sort Shops by their Product Count in Rails在 Rails 中按产品数量对商店进行排序
【发布时间】:2017-10-11 14:09:54
【问题描述】:

我正在尝试根据每个商店中的产品数量来订购商店列表。我在 Shop 和 Product 之间有一个连接,即所有权。所以我的模型看起来像:

shop.rb

has_many :ownerships
has_many :products, through: :ownerships

产品.rb

has_many :ownerships
has_many :shops, through: :ownerships

所有权.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

【问题讨论】:

  • 上面给了我同样的 PG::GroupingError。使用Shop.all.sort_by { |s| s.products.count }确实有效,但速度很慢。
  • 算什么?唯一产品的数量或所有产品的总库存数量,甚至是特定产品的数量?
  • 商店按唯一产品总数(降序)分组。

标签: ruby-on-rails postgresql activerecord


【解决方案1】:

我已经在我的网站上尝试过,我认为我们这个问题只是因为 PG group by 请试试这个:

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

【讨论】:

  • 这太接近了,但是,这似乎是在订购产品,而不是实例,这很奇怪,因为它像 #<Instance:0x007fe211333858 作为对象头返回,但第一个属性是 @ 987654323@ 这不是一个有效的实例 ID,而是一个产品 ID
【解决方案2】:

想出来以防万一有人遇到同样的事情。

所有答案/cmets 都非常接近,但为了让商店按产品最多的降序排序,我使用了:

@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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多