Почему while + sleep + ActiveRecord.find в Rails не возвращает записи, когда это необходимо? - PullRequest
0 голосов
/ 19 апреля 2010

Я пытаюсь реализовать кометный подход в своем приложении на 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 секунд. Я ожидаю, что он увидит изменения в базе данных сразу после внесения изменений и возврата.

Есть идеи, почему? Я также открыт для предложений по улучшению.

1 Ответ

5 голосов
/ 19 апреля 2010

Это потому, что ваш запрос кешируется по умолчанию. Попробуйте это:

records = Something.uncached{Something.find(:all,
            :conditions => { :some_condition => false})}

Ссылка: Артикул 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...