2009-10-23 7 views
2

Je cherche des idées/informations sur la gestion des données temporelles avec Active Record (Rails). Un exemple serait l'histoire de l'emploi (100% en janvier, mais seulement 80% de février à aujourd'hui). Ceci serait probablement facile à aborder avec un 'has-many: eployment_parts' traditionnel. Mais il existe un autre cas où l'utilisateur peut planifier quelque chose comme une liste de tâches, que l'utilisateur peut modifier au fil du temps (ce dernier est valide de janvier à mars, un autre est valide de janvier à avril, puis de mai à août). Je sais, il n'y a pas de solution miracle pour ce genre d'exigences, mais je voudrais rassembler ici quelques idées/docmentations/plugins sur ce sujet. On dirait qu'il n'y a pas eu beaucoup de travail dans ce domaine pour les rails, du moins rien qui ait été rendu public.Données temporelles avec Rails/Enregistrement actif

S'il vous plaît, si vous avez une idée, un lien ou une pensée, laissez tomber une réponse courte!

Liens à ce jour:

Répondre

1

Vous devez en détail ce que vous voulez faire un peu plus.

Par exemple, de quelle "résolution" avez-vous besoin? Avez-vous l'intention d'enregistrer chaque heure travaillée de chaque jour? Ou juste la charge de travail mensuelle moyenne? Par semaine, peut-être?

En outre, que voulez-vous faire avec les vacances et les jours de maladie?

(EDIT - répondant au commentaire ci-dessous)

Dans votre cas, je partirais avec un modèle similaire à celui-ci:

class WorkSlice < ActiveRecord::Base 
    belongs_to :employee 
    validates_presence_of employee_id, start_date, end_date, percentage 

    def calculate_hours 
    #employees might have different hours per day (i.e. UK has 7, Spain has 8) 
    employee.hours_per_day * self.calculate_days 
    end 

    def calculate_days 
    #days between start_day and end_day that are not sick days, holidays or weekends 
    workdays = ... #this depends on how you model holidays, etc 
    return workdays * self.percentage 
    end 
end 

La seule association dont vous avez besoin est avec « employé », Pour autant que je sache. Une méthode sur l'employé vous permettrait de voir, par exemple, à quel point l'employé est «libre» à une date donnée.

+0

Vous pouvez ignorer des choses telles que les congés de maladie, vacances, etc. Le emplyoment_history dit: 'début: 2009.01.01 fin: 2009.04.30, pensum 100%' , 'start: 2009.05.01 fin: infinity, pensum: 80%' Le problème est que ce type de données 'temporelles' doit être géré d'une manière ou d'une autre, quand peut-on commencer et finir, quelle est l'entrée actuelle, etc. Cela devient même pire quand il y a des assocations. – reto

+0

édité ma réponse, montrant une implémentation possible – kikito

0

« Je sais, il n'y a pas de solution miracle pour ce genre d'exigences, »

Cela ne dépend un peu sur la façon dont l'argent dont vous avez besoin de votre balle être.

De toute façon. Vous pourriez également trouver les choses suivantes intéressantes:

(a) "Une vue d'ensemble et une analyse de TSQL2" par Hugh Darwen et C.J. Date. Un lien est sur www.thethirdmanifesto.com dans la section "Papers" en bas. (b) «Données temporelles et modèle relationnel», un livre complet des mêmes auteurs et de Nikos Lorentzos. Contient une proposition différente et complète ainsi que des justifications très solides pour lesquelles ils croient que cette proposition est meilleure. (c) Vous pouvez trouver une implémentation appelée SIRA_PRISE, écrite par moi, basée sur les idées de (b), sur shark.armchair.mb.ca/~erwin

2

nous avions besoin de garder des données historiques de tous modifications apportées aux enregistrements de la base de données, et pouvoir interroger les données dans le temps, sans affecter les performances d'interrogation des données actuelles.

La solution que nous avons envisagée est une dimension de type 2 à changement lent, avec des tables d'historique.L'implémentation est une gemme Ruby qui nécessite PostgreSQL 9.3 et s'intègre bien dans Active Record en l'étendant avec le framework temporel (par exemple Foo.as_of(1.year.ago).bars).

Vous pouvez trouver le code ici: https://github.com/ifad/chronomodel :-)

Questions connexes