【发布时间】:2016-10-10 16:23:58
【问题描述】:
我需要帮助解决数据库查询问题以生成正确的结果。这是一个使用 Rails 4.2.6、Ruby 2.2.4 和 Postgres 1.9.0 数据库开发的健身应用程序。当用户保存新的身体测量值时,我试图显示自上次测量以来的变化(例如英寸)。问题是以前保存的记录的更改值在显示视图中计算不正确。
这是我目前编写的代码:
控制器/fitness_measurements_controller.rb:
before_action :get_second_latest_waist_measurement
def
get_second_latest_waist_measurement
@waist_second_latest_measurement = @member.fitness_measurements.order(:created_at).offset(1).last.waist || 0
end
fitness_measurements/show.html.erb:
<p>
<strong>Change in waist since last measurement:</strong>
<%= (@fitness_measurement.waist - @waist_second_latest_measurement).round(2) %> in
</p>
使用测试数据,这是一个包含我的数据库查询结果的表。注意“计算变化”列中的值。
+------------+-----------+------------------+--------------------+
| Date | Waist(in) | Calc. Change(in) | Correct Change(in) |
+------------+-----------+------------------+--------------------+
| 2016-10-01 | 37.5 | +1.00 | +1.00 |
+------------+-----------+------------------+--------------------+
| 2016-09-01 | 36.5 | 0.00 | +3.00 |
+------------+-----------+------------------+--------------------+
| 2016-08-01 | 33.5 | -3.00 | +0.05 |
+------------+-----------+------------------+--------------------+
| 2016-07-01 | 33.0 | -3.50 | 0.00 |
+------------+-----------+------------------+--------------------+
如您所见,除了上次保存的记录(2016-10-01)外,“Calc. Change”列中的值不正确。我设计查询的方式有问题。
目前,我的查询检索到比上次保存的测量值低 1 的记录作为“第二个最新的腰围测量值”。在测试用例中,这是在 2016-09-01 创建的记录。这适用于保存到数据库的最后一条记录(在本例中为 2016-10-01),但是当我请求显示以前保存的记录的页面视图时会产生不正确的结果。例如,应将 2016-09-01 创建的记录与 2016--08-01 创建的记录进行比较。
在查询中使用“offset(1)”似乎是我的问题的根源,但我不知道如何获得正确的记录。是遍历记录的解决方案吗?我对在这种情况下如何做到这一点感到困惑?
我应该如何修复我的数据库查询以生成正确的更改值?如果有更好的方法,请告诉我。谢谢!
【问题讨论】:
标签: sql ruby-on-rails rails-activerecord postgresql-9.1