使用Rails / Active Record的时态数据

时间:2009-10-23 08:29:03

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

我正在寻找有关使用Active Record(Rails)管理时态数据的想法/信息。一个例子是emplyoment历史(1月100%工作,但从2月到现在只有80%)。使用传统的“has-many:eployment_parts”可以很容易地解决这个问题。但是还有另一种情况,用户可以计划类似todo列表的东西,用户可以随时间更改(此todo从1月到3月有效,另一个有效期从1月到4月,然后从5月到8月更改细节)。

我知道,对于这些要求没有灵丹妙药解决方案,但我想在这里收集一些关于这个主题的想法/文件/插件。看起来在这个领域还没有做过很多关于铁轨的事情,至少没有任何公开的事情。

如果您有想法,链接或想法,请回答简短的回答!

到目前为止

链接:

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

例如,您需要什么“分辨率”?你打算记录每一天的每个工作小时吗?或者只是平均工作量?每周,也许?

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

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

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

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

据我所知,您需要的唯一协会是“员工”。例如,员工的方法可以让您查看该员工在给定日期的“免费”状态。

答案 2 :(得分:0)

“我知道,对于这些要求,没有银弹解决方案,”

这确实取决于你需要子弹的银色。

总之。您可能会发现以下内容也很有趣:

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