跟踪应用程序中的产品销售情况并选择最畅销产品的最佳方式是什么?

What is the best way to keep track of product sales in an application and pick top selling?

我的数据库是这样设置的:

产品:

#  id             :integer          not null, primary key
#  code           :string
#  name           :string
#  category_id    :integer
...

订购商品:

#  id              :integer          not null, primary key
#  order_id        :integer
#  product_id      :integer
#  color_id        :integer
#  qty             :integer          default("0")
#  price           :money
...

订单:

#  id                  :integer
#  state               :string
#  placed_on           :datetime
...

现在这个设置让我很难选择best selling products in each week from each category。我怎样才能解决这个问题?另一个数据库来跟踪销售?请帮忙。

您基本上需要的是加入 categoriesproductsorder_itemsorders 表。

可以使用以下代码加入:

rel = Category.joins(products: [order_items: :order])
#=> SELECT "categories".* FROM "categories" INNER JOIN "products" ON "products"."category_id" = "categories"."id" INNER JOIN "order_items" ON "order_items"."product_id" = "products"."id" INNER JOIN "orders" ON "orders"."id" = "order_items"."order_id"

基于此,您可以按日期间隔进行过滤。

假设我们已经有了 d1d2 值,它们定义了我们感兴趣的时间间隔的开始和结束:

rel = rel.where('orders.placed_on >= ? AND orders.placed_on <= ?', d1, d2)

现在您可以聚合字段:

result = rel.select('categories.id, categories.name, SUM(order_items.qty) as qty, SUM(order_items.qty * order_items.price) as total')
  .group('categories.id, categories.name')
sample = result.first
sample.id # => 1
sample.name # => "Category 1"
sample.qty  # => 100.0
sample.total # => 500.0

对我来说,这看起来像是一个简单的数据库查询。以下应该是完成它的简单直接的步骤。

  • 加入三个表
  • date
  • 过滤
  • 分组依据product_id
  • 汇总 qty
  • 然后,按聚合值排序。

我对获取日期的方法没有信心。请在下面的查询中自行填写。

SELECT P.id, P.name, P.category_id, SUM(qty) as LastWeekSales
FROM Product as P INNER JOIN Order Items as OI 
                    ON P.id = OI.product_id
     INNER JOIN Order as O
                    ON O.id = OI.order_id
WHERE O.placed_on <= GetTodaysDate() AND O.placed_on > GetOneWeekBacksDate()
GROUPBY P.category_id
ORDERBY WeekSales

您需要做的就是在 ruby-on-rails 中准备此查询。我会这样做,但我对 ruby-on-rails.

一无所知

+1 关于在模型中处理这个问题。如果您同时需要,这里有一些可用的插入代码。我今晚在练习操作哈希,以防你看不出来,哈。

添加到订单型号:

def self.last_week
  Order.where(" created_at >= ? ", 1.week.ago.utc)
end

添加到任何控制器:

@qty_hash = category = Hash.new 0; 
@output_hash = Hash.new { |hash, key| hash[key] = {} }

@recently_ordered_items = OrderItem.find_all_by_order_id(Order.last_week)
@recently_ordered_items.each { |i| @qty_hash[i.product_id] += i.qty }
@recent_products=Product.find_all_by_id(@qty_hash.keys)

@qty_hash.each do |key, value|
  @recent_products.each { |i| category = i.category_id if i.id == key }
  @output_hash[category] = @output_hash[category].merge(@qty_hash.slice(key))
end

@output_hash 是输出,格式为: {1=>{3=>9}, 2=>{4=>8, 6=>5, 7=>4}}

在这种情况下,类别为 1 和 2,产品 ID 为 3(售出 9 件)、4(售出 8 件)、6(售出 5 件)和 7(售出 4 件)

已测试并正常工作。祝你好运。