Я пытаюсь реализовать кометный подход в своем приложении на Rails. У меня есть следующее:
def poll
records = []
start_time = Time.now.to_i
while records.length == 0 do
records = Something.find(:all,
:conditions => { :some_condition => false})
if records.length > 0
break
end
sleep 1
if Time.now.to_i - start_time >= 10
break
end
end
responseData = []
records.each do |record|
responseData << {
'something' => record.some_value
}
# Flag message as received.
record.some_condition = true
record.save
end
render :text => responseData.to_json
end
Теперь, когда я захожу на URL-адрес вручную, он сидит там и ждет 10 секунд и время ожидания истекает, как и ожидалось. Если я изменю свою базу данных так, чтобы Something.find () возвращал записи, а затем снова переходил по URL-адресу, вызов немедленно возвращался.
Однако, если я перехожу по URL-адресу, а затем быстро запускаю обновление базы данных, так что Something.find () должен найти записи, он просто остается там до истечения времени ожидания через 10 секунд. Я ожидаю, что он увидит изменения в базе данных сразу после внесения изменений и возврата.
Есть идеи, почему? Я также открыт для предложений по улучшению.