0

我有一個問題答覆列表。查詢更改會在導軌中生成重複結果

每個響應在HTML中的data-timestamp屬性中都有自己的時間戳轉換爲整數(通過to_i)。

我從最近的響應中提取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); 
} 

在th E控制器然後我查詢此日期之後創建的所有迴應:

def polling 
    @responses = Response.where("created_at > ?", Time.at(params[:after].to_i)) 
end 
+0

展示如何你是「從數據庫(在日期時間格式)轉換created_at成整數,然後回一個在Rails中的實時對象它切斷了毫秒「 –

+0

您的數據庫是否支持其日期時間類型的毫秒精度? –

+0

更新了帖子以顯示代碼。 是的,數據庫(postgres)支持毫秒級的日期時間精度。 –

回答

1

我已經在過去使用

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

成功輪詢時在軌道的變化。

對不起不能下去了,沒有看到更多的代碼

+0

我曾考慮過這一點,但認爲當兩個回覆發佈在彼此之間時,可能會導致問題。難道它不會忽視第二篇文章嗎? –

0

OK的幫助,我設法通過以下操作來解決此問題:

我改變了DIV類,以便它輸出與時間(毫秒)作爲一個整數

<div class="row response" data-time="<%= @response.created_at.utc.strftime("%s%6N").to_i %>"> 

(注意轉換UTC - 重要的是防止從Rails的給你對應於你的應用程序中設置的時區值的所有日期時間都保存在數據庫中作爲默認UTC。 )

然後,我將其轉換爲控制器中的一個BigDecimal,並將其分開以給出正確的十進制精度。然後我用這個數字來設定時間。在:

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