我有一个问题回复列表。
每个响应都有自己的时间戳,转换为HTML中to_i
属性中的整数(通过data-timestamp
)。
我从最近的响应中提取data-timestamp
值,然后将其传递给控制器,每5秒查询一次数据库以获取任何新响应。
问题在于它不断返回最后一个响应。反复(即它永远不会停止)。
我已经跟踪了这一事实,当我将created_at
从数据库(以日期时间格式)转换为整数然后返回到Rails中的时间对象时,它会切断毫秒,即:
最后一次回复的实际时间戳:
2013-01-07 14:30:00.610491
Rails用于查询数据库的数字:
2013-01-07 14:30:00.000000
关于如何解决这个问题的任何想法?
编辑:这里的请求是我的代码:
这是我用来从上一个响应中获取最新时间戳的方法:
<div class="row response" data-time="<%= @response.created_at.to_i %>">
然后我通过Javascript将其作为参数传递给控制器(响应按时间倒序排列,因此最近的响应是第一个):
function updateResponses() {
var after = $('.response:first').attr('data-time');
$.getScript("/responses/polling.js?after=" + after);
}
在控制器中,我查询在此日期之后创建的所有响应:
def polling
@responses = Response.where("created_at > ?", Time.at(params[:after].to_i))
end
答案 0 :(得分:1)
我用过
@latest = YOURMODEL.where("created_at > ?", Time.at(params[:after].to_i + 1))
过去在轮询铁路变更时取得了成功。
对不起,如果没有看到更多代码,我们将无法提供帮助
答案 1 :(得分:0)
好的,我设法解决了以下问题:
我更改了div类,以便以毫秒为整数输出时间
<div class="row response" data-time="<%= @response.created_at.utc.strftime("%s%6N").to_i %>">
(请注意转换UTC - 对于防止Rails为您提供与您为应用设置的时区相对应的值非常重要。默认情况下,所有日期时间都会以UTC格式保存在数据库中。)
然后我将它转换为控制器中的BigDecimal并进行分割,以便在小数上给出正确的精度。然后我用这个数字来设置Time.at:
def polling
undivided_millisecond_epoch_time_in_integer = params[:after]
undivided_millisecond_epoch_time_in_decimal = (undivided_millisecond_epoch_time_in_integer).to_d
divided_millisecond_epoch_time_in_decimal = (undivided_millisecond_epoch_time_in_decimal / 1000000).to_d
@responses = Response.where("created_at > ?", Time.at(divided_millisecond_epoch_time_in_decimal))
end
这为我提供了毫秒的正确查询:
Response Load (0.6ms) SELECT "responses".* FROM "responses" WHERE ( created_at > '2013-01-08 08:49:28.832908')