0

我有一个问题的答案列表。

每个响应都有自己的时间戳,在 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
4

2 回答 2

1

我用过

@latest = YOURMODEL.where("created_at > ?", Time.at(params[:after].to_i + 1))

过去在轮询 Rails 的变化时取得了成功。

抱歉,如果没有看到更多您的代码,将无法再提供帮助

于 2013-01-07T18:36:09.597 回答
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')
于 2013-01-08T08:55:46.473 回答