0

質問に対する回答のリストがあります。

各応答には、HTMLto_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))

レールの変更をポーリングするときに過去に成功しました。

申し訳ありませんが、コードをもっと見ないと役に立ちません

于 2013-01-07T18:36:09.597 に答える
0

OK、次の方法でこれを解決できました。

ミリ秒単位の時間を整数として出力するようにdivクラスを変更しました

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

(変換 UTC に注意してください。Rails がアプリに設定したタイムゾーンに対応する値を提供しないようにするために重要です。すべての日時は、デフォルトで UTC として DB に保存されます。)

次に、これをコントローラーで BigDecimal に変換し、除算して 10 進数の正しい精度を得ました。次に、この図を使用して 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 に答える