【问题标题】:Rails get most sold productsRails 获得最畅销的产品
【发布时间】:2016-03-03 11:21:40
【问题描述】:

我想退回 N 件最畅销的产品,我的型号:

订购

has_many :order_items

订单项

belongs_to :order
belongs_to :product
quantity

到现在为止我都有这样的东西,但它不包括数量和错误,任何帮助都会很棒。

product.rb

def self.popular
  products = OrderItem.group(:product_id).count
  ids = products.sort_by {|k,v| v}.reverse
  where(id: ids)
end

示例:

[#<OrderItem:0x007fa522727328 id: 1, order_id: 1, product_id: 1, quantity: 3>,
 #<OrderItem:0x007fa5227270a8 id: 2, order_id: 2, product_id: 5, quantity: 4>,
 #<OrderItem:0x007fa522726d88 id: 3, order_id: 2, product_id: 9, quantity: 9>]

期望的输出:

[#<Product:0x007fa5298f9a28 id: 3, title: 'MacBook air'>,
 #<Product:0x007fa5298f9b28 id: 5, title: 'Iphone 6s'>,
 #<Product:0x007fa5298f9c28 id: 1, title: 'Nexus 5'>]

【问题讨论】:

    标签: ruby-on-rails arrays postgresql sorting activerecord


    【解决方案1】:

    刚刚换了行

    ids = products.sort_by {|k,v| v}.reverse
    

    ids = products.sort_by {|k,v| v}.reverse.map(&:first)
    

    我在控制台中试过了,效果很好。

    更新:

    quantity 字段的总和排序:

    products = OrderItem.group(:product_id).sum(:quantity)
    ids = products.sort_by {|k,v| v}.reverse.map(&:first)
    

    更新2:

    在您的product 模型中添加此方法:

    def self.order_by_ids(ids)
      order_by = ["case"]
      ids.each_with_index.map do |id, index|
        order_by << "WHEN id='#{id}' THEN #{index}"
      end
      order_by << "end"
      order(order_by.join(" "))
    end
    

    然后:

    products = OrderItem.group(:product_id).sum(:quantity)
    ids = products.sort_by {|k,v| v}.reverse.map(&:first)
    where(id: ids)..order_by_ids(ids)
    

    【讨论】:

    • 但它没有考虑quantity字段并且顺序不正确
    • 您是按关联计数还是按数量总和订购?
    • 谢谢,它几乎可以工作了,但现在排序不正确,有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多