轮询更改会在rails中生成重复结果

时间:2013-01-07 17:26:48

标签: ruby-on-rails ruby ruby-on-rails-3 jquery ruby-on-rails-3.2

我有一个问题回复列表。

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

2 个答案:

答案 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')