Vous pouvez utiliser DelayedJob pour effectuer ces requêtes et disposer d'une table supplémentaire appelée "NotificationQueue". Lorsqu'un travail est terminé (avec son jeu de résultats), stockez le jeu de résultats et l'ID utilisateur de la personne qui a effectué cette requête dans la table NotificationQueue. Ensuite, à chaque chargement de page (et, si vous le souhaitez, toutes les 15-20 secondes), interrogez cette base de données et vérifiez s'il existe des requêtes terminées.
DelayedJob est vraiment génial parce que vous écrivez votre code comme si elle n'a pas été va être un emploi retardé, et il suffit de changer le code pour effectuer les opérations suivantes:
#Your method
Query.do_something(params)
#Change to
Query.send_later(:do_something, params)
Nous utilisons tous les temps au travail, et cela fonctionne très bien.
J'adore * ce design. –
DelayedJob semble prometteur, mais comment stockez-vous le jeu de résultats lorsque vous utilisez ActiveRecord? – Trevor
DelayedJob exécute essentiellement une copie de votre application. Il a accès à votre base de données, donc quand vous appelez le travail retardé, il dit: «Ok, exécutez ce morceau de code, avec ces données». Il va enregistrer dans la base de données, tout comme une fonction régulière. –