使用 Heroku,Rails 排序在 updated_at 时间戳列上不正确
Using Heroku, Rails sort is incorrect on updated_at timestamp column
我有一个在 Heroku 上使用 PostgreSQL 的 Rails 4.0 应用程序。我正在尝试显示一个 table 这是我的 XLog 或事务日志,按 updated_at 时间戳倒序显示最后五个条目。这在我的本地系统上正常工作。当我将它推送到 Heroku 时,它排序不正确。
我检查了 Heroku 数据库定义,该列被正确列为时间戳。我已将 Heroku 代码克隆回我的机器并验证它与我推送的相同。在这一点上,我不知道为什么它在本地工作时在 Heroku 上不起作用。和建议将不胜感激。
FWIW,远程数据库和本地数据库没有相同的数据。
代码是:(添加了 log_sort 的最后一行作为断点,仍然会传递正确的结果。)
def self.last_objects object, count
logs = XLog.where(object: object).last(count)
log_sort = logs.sort_by{|log| log.updated_at}.reverse
log_sort
end
执行到断点的过程中,可以看到传递的变量:
这是正确排序的本地结果:
这是排序错误的 Heroku 结果:
这是 updated_at 的 Heroku PostgreSQL table 定义:
编辑:查看:
<% xlog = xlog_last(car.stock_number, 5) %>
...
<% xlog.each do |log| %>
<tr>
<td><%= log.associate %></td>
<td><%= log.proxy %></td>
<td><%= log.action %></td>
<td><%= log.status %></td>
<td><%= log.message %></td>
<td><%= log.value %></td>
<td><%= log.updated_at %></td>
</tr>
<% end %>
帮手:
def xlog_last(object, count)
XLog.last_objects object, count
end
编辑:
我修改了 sort_by 以使用如下订购方法。结果一点都没有改变。出现同样的排序错误,完全一样的数据以完全一样的方式显示:
新代码:
def self.last_objects object, count
logs = XLog.where(object: object).order(updated_at: :desc).first(count)
end
我相信您需要使用 order
来影响实际的 sql 查询。现在您正在使用 sort_by
,它在您从数据库中读取数据后对数据进行排序。数据库中的顺序基于它的插入方式,可能与 heroku 和您的本地系统不同。当您从 heroku 导出,然后导入它时,表的顺序可能也会发生变化。
A gem 错误地对视图进行了排序。纠正该问题解决了问题。仍然不确定为什么它没有在测试中显示,可能是数据差异。
我有一个在 Heroku 上使用 PostgreSQL 的 Rails 4.0 应用程序。我正在尝试显示一个 table 这是我的 XLog 或事务日志,按 updated_at 时间戳倒序显示最后五个条目。这在我的本地系统上正常工作。当我将它推送到 Heroku 时,它排序不正确。
我检查了 Heroku 数据库定义,该列被正确列为时间戳。我已将 Heroku 代码克隆回我的机器并验证它与我推送的相同。在这一点上,我不知道为什么它在本地工作时在 Heroku 上不起作用。和建议将不胜感激。
FWIW,远程数据库和本地数据库没有相同的数据。
代码是:(添加了 log_sort 的最后一行作为断点,仍然会传递正确的结果。)
def self.last_objects object, count
logs = XLog.where(object: object).last(count)
log_sort = logs.sort_by{|log| log.updated_at}.reverse
log_sort
end
执行到断点的过程中,可以看到传递的变量:
这是正确排序的本地结果:
这是排序错误的 Heroku 结果:
这是 updated_at 的 Heroku PostgreSQL table 定义:
编辑:查看:
<% xlog = xlog_last(car.stock_number, 5) %>
...
<% xlog.each do |log| %>
<tr>
<td><%= log.associate %></td>
<td><%= log.proxy %></td>
<td><%= log.action %></td>
<td><%= log.status %></td>
<td><%= log.message %></td>
<td><%= log.value %></td>
<td><%= log.updated_at %></td>
</tr>
<% end %>
帮手:
def xlog_last(object, count)
XLog.last_objects object, count
end
编辑: 我修改了 sort_by 以使用如下订购方法。结果一点都没有改变。出现同样的排序错误,完全一样的数据以完全一样的方式显示:
新代码:
def self.last_objects object, count
logs = XLog.where(object: object).order(updated_at: :desc).first(count)
end
我相信您需要使用 order
来影响实际的 sql 查询。现在您正在使用 sort_by
,它在您从数据库中读取数据后对数据进行排序。数据库中的顺序基于它的插入方式,可能与 heroku 和您的本地系统不同。当您从 heroku 导出,然后导入它时,表的顺序可能也会发生变化。
A gem 错误地对视图进行了排序。纠正该问题解决了问题。仍然不确定为什么它没有在测试中显示,可能是数据差异。