ruby-on-rails - Rails 获得最畅销的产品

标签 ruby-on-rails arrays postgresql sorting activerecord

我想退回 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'>]

最佳答案

只是换了行

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

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

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

更新:

数量字段的总和排序:

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

更新2:

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

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)

关于ruby-on-rails - Rails 获得最畅销的产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33988175/

相关文章:

python - 查询矩阵中的行

java - 堆栈添加机不添加但挂起等待更多参数

php - Laravel artisan 忽略我的 app/config/database.php

c++ - 如何将 time_t 插入 PostgreSQL 时间戳字段

ruby-on-rails - 验证失败,因为验证存在未得到遵守rails 5

ruby-on-rails - Notifications ala Facebook(数据库实现)

css - slim : Textfield and button on the same height

ruby-on-rails - 即使引用了用户,注释中的未定义方法 'username'

javascript - 从对象填充模型值。

postgresql - 如何在 sequelize 中使用 where 子句两次包含相同的表数据?