【问题标题】:Temporal data with Rails / Active RecordRails / Active Record 的时态数据
【发布时间】:2023-03-04 17:07:01
【问题描述】:

我正在寻找有关使用 Active Record (Rails) 管理时态数据的想法/信息。一个例子是就业历史(1 月份工作 100%,但从 2 月到现在只有 80%)。这可能很容易用传统的'has-many :eployment_parts'来解决。但是还有另一种情况,用户可以计划类似待办事项列表之类的内容,用户可以随时间更改该待办事项(此待办事项从 1 月至 3 月有效,另一个从 1 月至 4 月有效,然后从 5 月到 8 月更改了详细信息)。

我知道,对于这类要求没有灵丹妙药的解决方案,但我想在这里收集一些关于这个主题的想法/文档/插件。看起来在这方面并没有为 Rails 做太多工作,至少没有什么公开的。

如果您有任何想法、链接或想法,请留下简短的回答!

到目前为止的链接:

【问题讨论】:

    标签: ruby-on-rails ruby database-design


    【解决方案1】:

    我们需要保留对数据库记录的所有更改的历史数据,并能够实时查询数据,而不会影响查询当前数据的性能。

    我们设想的解决方案是带有历史表的缓慢变化维度类型 2。该实现是一个 Ruby gem,需要 PostgreSQL 9.3 并且非常适合 Active Record 扩展它与时间框架(例如Foo.as_of(1.year.ago).bars)。

    您可以在这里找到代码:https://github.com/ifad/chronomodel :-)

    【讨论】:

      【解决方案2】:

      你需要详细说明你想做的事情。

      例如,您需要什么“分辨率”?您是否计划记录每天的每个工作时间?还是只是平均每月的工作量?每周一次,也许吧?

      另外,假期和病假你想做什么?

      (编辑 - 回答下面的评论)

      在您的情况下,我会选择与此类似的模型:

      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
      

      据我所知,您需要的唯一关联是与“员工”。例如,员工方法可以让您查看该员工在给定日期的“空闲”程度。

      【讨论】:

      • 您可以忽略病假、假期等。emplyoment_history 显示:'start: 2009.01.01 end: 2009.04.30, pensum 100%', 'start: 2009.05.01 end: infinity , pensum: 80%' 问题是这些“时间”数据必须以某种方式进行管理,什么时间范围开始和结束,即当前条目等。当有关联时,情况会变得更糟。
      【解决方案3】:

      “我知道,对于这些要求没有灵丹妙药,”

      这在一定程度上取决于你需要多少银子。

      无论如何。您可能还会发现以下内容也很有趣:

      (a) Hugh Darwen 和 C.J. Date 的“TSQL2 概述和分析”。链接位于 www.thethirdmanifesto.com 底部的“论文”部分。 (b) “时间数据和关系模型”,同一作者加上 Nikos Lorentzos 的完整书籍。包含一个不同的、完整的提案以及他们认为该提案更好的非常合理的理由。 (c) 你可以在 Shark.armchair.mb.ca/~erwin 上找到我根据 (b) 中的想法编写的名为 SIRA_PRISE 的实现

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-27
        相关资源
        最近更新 更多