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.
Sweet! Ça marche. Merci. –