如何在rails模型中保留历史记录

时间:2014-05-13 17:46:48

标签: ruby-on-rails ruby

这里有三个问题,所有问题都以粗体设置。

我有一个人事数据库,其中也存储了历史数据。 每个表格都有两列startstop,表示此事实有效的时间段。

当记录的任何字段发生变化时,会使用start=todaystop=nil创建新记录, 并且旧记录被赋予stop=today-1(或者更改的生效日期而不是今天)。

当要删除记录时,我们只需设置stop=today

,而不是删除

这样很容易

  • 提供任何员工的历史
  • 简要介绍特定日期的情况

首先,这种模式似乎很常见,我可能不需要重新发明轮子。 然而在我的搜索中,我发现的是一些名为auditablepapertrail的宝石。 从第一眼看,他们似乎没有做我想要的,但也许我错了。 你知道宝石做类似的东西吗?

如果我找不到解决方案,对我的目的来说足够的是有一些适用于我所有模型的方法,例如

def when(date)
    self.where("start <= ? and ? <= stop", ondate, ondate)
end

我想过继承

class MyRecord < ActiveRecord::Base
    def when ...
    end
end

让我的所有模特继承自MyRecord,但这打破了一切。的为什么吗

我可以将我的方法添加到ActiveRecord::Base,但这似乎不对。 向所有模型添加方法的正确方法是什么?

答案

此问题的第2部分和第3部分已在here之前得到解答。由于这包含Josh的答案(我+ 1),以及继承MyRecord的原因不起作用,我不接受Josh的答案。

我仍然没有找到一个保持良好历史的宝石,但三分之二也不错......

1 个答案:

答案 0 :(得分:1)

这听起来像是一个使用ActiveSupport::Concern的绝佳机会。你可以这样写:

<强> History.rb

require 'active_support/concern'

module History
  extend ActiveSupport::Concern
  included do
    def self.when(date)
      self.where("start <= ? and ? <= stop", ondate, ondate)
    end
  end
end

您的模型

class SomeClass < ActiveRecord::Base
  include History
end

然后,您可以在需要包含历史记录的任何模型上调用SomeClass.when(some_date_string)