2010-04-19 10 views
0

J'essaie d'implémenter une approche de comète dans mon application Rails. Je donne les résultats suivants:Pourquoi est-ce que while loop + sleep + ActiveRecord.find dans Rails ne retourne pas les enregistrements quand il le devrait?

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 

Maintenant, quand je vais à l'URL manuellement, il est assis là et attend pendant 10 secondes et les temps comme prévu. Si je modifie ma base de données de sorte que Something.find() renvoie des enregistrements, puis renvoie à l'URL à nouveau, l'appel renvoie immédiatement. Cependant, si je vais à l'URL, puis j'exécute rapidement une mise à jour sur la base de données de sorte que Something.find() trouve des enregistrements, il reste là jusqu'à ce qu'il expire après 10 secondes. Je m'attendrais à ce qu'il devrait voir le changement à la base de données juste après que je fasse le changement et le retour.

Des idées pourquoi? Je suis également ouvert aux suggestions d'améliorations.

Répondre

5

Cela est dû au fait que votre requête est mise en cache par défaut. Essayez ceci:

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

Référence: Article 1

+0

Sweet! Ça marche. Merci. –