我已经设置了这样的数据库:
产品:
# 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
。我怎样才能解决这个问题?另一个跟踪销售情况的数据库?请帮忙。
答案 0 :(得分:5)
您基本上需要加入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"
基于此,您可以按日期间隔进行过滤。
假设我们已经有d1
和d2
值,它们定义了我们感兴趣的区间的开始和结束:
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
答案 1 :(得分: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 一无所知。
答案 2 :(得分:0)
+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 =&gt; {3 =&gt; 9},2 =&gt; {4 =&gt; 8,6 =&gt; 5,7 =&gt; 4}}
在这种情况下,类别为1和2,产品ID为3(9个已售出),4个(已售出8个),6个(已售出5个)和7个(已售出4个)
经过测试和工作。祝你好运。