【问题标题】:Get attribute values at beginning and end of a date range获取日期范围开头和结尾的属性值
【发布时间】:2016-10-31 14:22:19
【问题描述】:

我有一个数据库表 stockmovements,其中包含 DATE、PRODUCT、UNITS、TYPE、STOCK 列。 STOCK 会在特定库存移动完成时保存该日期的库存价值。 TYPE 可以购买或出售或退货。

我按产品分组,以便我视图中表格的任何行都显示产品。然后我想创建 2 列。库存开始和库存结束。显示日期范围的第一个和最后一个日期的股票价值。所以稍后假设我应用我过滤 10 月 1 日 - 10 月 31 日,2 列将显示 10 月 1 日的股票价值和 10 月 31 日的股票价值。

如果没有应用过滤器,列将显示数据库中所有值中最早和最新的库存值。

在中间的列中显示每种股票运动类型的单位。这样最终将是产品,库存开始,购买,出售,退货,库存结束。这只是为了给出关于一般逻辑的想法,但对于这个问题并不重要。

我的控制器中有这个:

@stockmovements = Stockmovement.all.group(:PRODUCT)

我应该在视图中添加什么:

 <td><%= number_to_human stockmovement.STOCK, precision: 0 %></td>

获取日期范围开始和结束时的股票价值?还是应该在模型中完成?我基本上需要 DATE= 开始日期的 STOCK 和 DATE= 结束日期的 STOCK。但我找不到任何帮手。

【问题讨论】:

  • 如果可以更改,则应将列设为小写(例如“日期、产品、单位、类型、库存”)。但是我的主要问题是,当您说 STOCK 通过“价值”节省了股票的价值时,您的意思是股票数量 * 单价?是当前运动之前还是之后的值?
  • 我正在现有数据库上构建应用程序,因此无法更改数据库。没有 STOCK 与 sum(UNITS) 相同。这是当前运动之后的值。想象一下 PRODUCT、UNITS、STOCK 列。我购买 |产品 A、3、3 |然后我做销售|产品 A,-1,2 |.
  • 我的意思是它不需要任何计算。我只是在建立一个报告。我只需要读取数据库中的这些值。我只需要在这两个日期展示它们。
  • 对,好的,那么对于“开始”列,您确实需要 STOCK - 第一条记录的单位(开始值)。 ?
  • 是的,没错。好吧,我只需要股票。我不需要第一条或最后一条记录的 UNITS 值..

标签: ruby-on-rails


【解决方案1】:

这会给你一个哈希值,{location => [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

然后,假设您按位置进行迭代,您可以参考 &lt;%= @stockopenclose[location][0] %&gt; 的开盘价和 &lt;%= @stockopenclose[location][1] %&gt; 的收盘价。

但是有几个问题……

开盘时的 STOCK 值将是应用第一次移动后的值,因此它不是真正的开盘值。我认为开幕式需要......

stock, units = movements.sort('DATE ASC').limit(1).pluck('STOCK', 'UNITS').first
opening_value = stock.to_i - units.to_i

其次,这不处理缓慢移动的股票,即在此期间没有活动的股票不会出现在列表中,因此如果此报告是库存分析,那么它是有缺陷的。

【讨论】:

  • 感谢您的回答。你对我没有考虑到的开盘价是正确的。关于没有活动的产品没有显示在列表中,这很好。唯一有用的价值是库存,但我有另一份报告。好的,我需要一段时间来了解您的解决方案。我会尽快通知您。
  • 抱歉,该列实际上是一个日期时间,其值类似于 2015-02-16 11:38:03 UTC。这会影响您的解决方案吗?因为现在我得到了未定义的局部变量或方法 `from_date' for.....
  • 我没有指定 from_dateto_date 因为我认为这将由您设置...我已经修改了我的答案以显示如何设置...跨度>
  • 好的,现在更清楚了,我试图了解这些是否是一种帮手,但我现在明白了。我正在使用 ransack,因此我需要找到一种将其与您的解决方案集成的方法。这些值不能是静态的。我不能真正理解的一件事是按位置迭代部分。我需要阅读有关迭代数组的更多信息。我明天会回来。
  • 我得到undefined local variable or method location' 的#` 尽管我在 stockmovements 中有一个 LOCATION 列和一个带有模块 Location 的表位置。但老实说,我真的不明白那个部分在做什么,所以很难修复。如果不太麻烦,请您解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2013-11-15
  • 2016-04-04
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多