2009-07-21 22 views
5

Les solutions Cron dans les rails sont nombreuses et plutôt bonnes. Ce n'est pas ce dont je me bats ici. Au lieu de cela, ce qui me pose problème, c'est de laisser les utilisateurs créer leurs propres tâches récurrentes (comme les rappels) - en particulier comment les modéliser et les stocker dans la base de données (une bonne interface est non négligeable - serait génial s'il y avait du code là-bas pour ça). Le calendrier de Google est un excellent exemple ici (l'interface utilisateur pour ajouter un événement, pas tout le calendrier) ... ils devraient pouvoir faire tous les jours à 13h CST, ou lundi/mercredi/vendredi, ou par semaine, etc. être utilisé aurait alors besoin d'interroger la base de données pour voir quels rappels devaient être envoyés à cette heure, etc.Comment modéliser et stocker des tâches récurrentes dans des rails?

Quelqu'un a vu un bon plugin/gem pour cela dans les rails? On dirait qu'il y aurait quelque chose là-dedans, mais je ne l'ai pas encore trouvé.

Merci!

+0

Je suis à la recherche de la même chose! Avez-vous trouvé une solution à votre problème? – Zabba

+0

voir ma réponse acceptée ci-dessous - roulé ma propre solution simple –

Répondre

5

J'ai fini par rouler ma propre solution car je n'avais besoin de rien d'extraordinaire.

Fondamentalement, j'ai ajouté une colonne next_run datetime et interval chaîne à la base de données qui était l'un de (jour, semaine, etc). Ensuite, configurez un travail cron à exécuter qui recherche les dates next_run passées. Il les exécute et définit next_run à un certain point à l'avenir basé sur la colonne interval.

Simple mais a travaillé pour mes besoins.

1

réfléchit actuellement à l'aide d'un plug-in comme celui-ci pour stocker récurrences dans une table http://github.com/fnando/recurrence/tree/master

chaque rappel aurait un objet de récurrence, et le rappel serait également garder un champ datetime quand il est censé envoyer ses prochain. Alors le Cron pourrait ...

get all reminder's whose "next_send" date has passed 
for each reminder 
    send it 
    update the "next_send" field using the recurrence object 
end 

S'il y a de meilleures solutions ou je vais sur le mauvais chemin, entrée toujours apprécié.

1

J'ai toujours trouvé que les solutions ical (le RFC, pas le programme) étaient la meilleure approche pour travailler avec des événements récurrents. Il y a quelques bonnes bibliothèques Ruby pour traiter avec ical, et le plus jeune enfant sur le bloc est ri_cal.

+0

rical regards grandes et pleines fonctionnalités, je suis en quelque sorte confus sur la façon dont il pourrait intégrer avec des rails. Stocke-t-il des événements ou des objets de calendrier dans la base de données? Comment regarderiez-vous les événements en retard ou faites des requêtes? Merci! –

+0

recherche => recherche –

+1

ressemble malheureusement à rical ne vous permet pas d'enregistrer quoi que ce soit à la base de données .... c'est juste pour lire/générer des fichiers ical –

0

J'ai actuellement ce problème et la solution que je considérais comme suit:

class AllowReoccuringTasks < ActiveRecord::Migration 
    def self.up 
     add_column :tasks, :reoccuring, :boolean 
     add_column :tasks, :period, :integer 
    end 
end 

où la période peut être 1 (tous les jours), 7 (chaque semaine) ou 14 (Toutes les autres semaines). Si vous vouliez prendre en charge d'autres types de planifications comme tous les mois, jours de la semaine, week-ends, etc., vous pourriez plutôt ajouter une colonne appelée "schedule" et utiliser des constantes pour représenter différents types de planification. Vous pouvez également utiliser le enum plugin.