THp*_*ubs 4 database ruby-on-rails e-commerce
我已经设置了这样的数据库:
产品:
# id :integer not null, primary key
# code :string
# name :string
# category_id :integer
...
Run Code Online (Sandbox Code Playgroud)
订单商品:
# id :integer not null, primary key
# order_id :integer
# product_id :integer
# color_id :integer
# qty :integer default("0")
# price :money
...
Run Code Online (Sandbox Code Playgroud)
订单:
# id :integer
# state :string
# placed_on :datetime
...
Run Code Online (Sandbox Code Playgroud)
现在这个设置让我很难选择best selling products in each week from each category.我怎样才能解决这个问题?另一个跟踪销售情况的数据库?请帮忙.
你基本上需要的是加盟categories,products,order_items和orders表格.
可以使用以下代码完成连接:
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"
Run Code Online (Sandbox Code Playgroud)
基于此,您可以过滤日期间隔.
假设我们已经拥有d1和d2值,它们定义了我们感兴趣的区间的开始和结束:
rel = rel.where('orders.placed_on >= ? AND orders.placed_on <= ?', d1, d2)
Run Code Online (Sandbox Code Playgroud)
现在您可以在字段上聚合:
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
Run Code Online (Sandbox Code Playgroud)