我有一个数据库表 stockmovements ,其中包含DATE,PRODUCT,UNITS,TYPE,STOCK列。当某个库存移动完成时,STOCK保存该日期的库存值。 TYPE可以购买或出售或退货。
我按产品分组,以便我视图中表格的任何一行都显示产品。然后我想创建2列。股票开始和股票结束。显示日期范围的第一个和最后一个日期的股票价值。因此,稍后我要申请I过滤10月1日 - 10月31日,2列将显示10月1日的股票价值和10月31日的股票价值。
如果未应用过滤器,列将显示数据库中所有值中最早和最新库存移动的库存值。
在中间列中显示每个stockmovement类型的单位。这样最终将是产品,库存开始,购买,出售,退货,库存结束。这只是为了给出一般逻辑的概念,但这对问题并不重要。
我在控制器中有这个:
@stockmovements = Stockmovement.all.group(:PRODUCT)
我应该在观点中添加什么:
<td><%= number_to_human stockmovement.STOCK, precision: 0 %></td>
获取日期范围开头和结尾的股票价值?或者应该在模型中完成?我基本上需要STOCK,其中DATE =开始日期和STOCK,其中DATE =结束日期。但我找不到任何帮助。
答案 0 :(得分:0)
这会给你一个值的哈希,{location =&gt; [opening_value,closing_value]}
# replace following with whatever dates you need, probably
# from params (input form)
from_date = DateTime.parse('2016-10-01')
to_date = DateTime.parse('2016-10-31').end_of_day
@stockopenclose = {}
products = Stockmovement.where('DATE >= ? AND DATE <= ?',from_date, to_date).pluck(:product).uniq.sort
products.each do |product|
movements = Stockmovement.where('DATE >= ? AND DATE <= ? AND PRODUCT = ?',from_date, to_date, product)
opening_value = movements.sort('DATE ASC').limit(1).pluck('STOCK').first
closing_value = movements.sort('DATE DEC').limit(1).pluck('STOCK').first
@stockopenclose[product] = [opening_value, closing_value]
end
然后,您可以引用<%= @stockopenclose[location][0] %>
表示开头价值,<%= @stockopenclose[location][1] %>
表示结算,假设您按位置进行迭代。
但是有一些问题......
开盘价时的股票将是第一次移动后的值,因此它不会成为真正的开盘价。我认为开幕式需要......
stock, units = movements.sort('DATE ASC').limit(1).pluck('STOCK', 'UNITS').first
opening_value = stock.to_i - units.to_i
其次,这并不能处理缓慢移动的股票,即期间没有活动的股票不会出现在列表中,所以如果这个报告是库存分析,那么它是不足的。 / p>