I'm trying to implement a comet approach in my Rails application. I have the following:
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
Now, when I go to the URL manually, it sits there and waits for 10 seconds and times out as expected. If I modify my database so that the Something.find() returns records and then go to the URL again, the call returns immediately.
However, if I go to the URL, and then I quickly run an update on the database such that the Something.find() should find records, it just sits there until it times out after 10 seconds. I would expect that it should see the change to the database right after I make the change and return.
Any ideas why? I'm also open to suggestions on improvements.