这里有三个问题,所有问题都以粗体设置。
我有一个人事数据库,其中也存储了历史数据。
每个表格都有两列start
和stop
,表示此事实有效的时间段。
当记录的任何字段发生变化时,会使用start=today
和stop=nil
创建新记录,
并且旧记录被赋予stop=today-1
(或者更改的生效日期而不是今天)。
当要删除记录时,我们只需设置stop=today
。
这样很容易
首先,这种模式似乎很常见,我可能不需要重新发明轮子。
然而在我的搜索中,我发现的是一些名为auditable
或papertrail
的宝石。
从第一眼看,他们似乎没有做我想要的,但也许我错了。
你知道宝石做类似的东西吗?
如果我找不到解决方案,对我的目的来说足够的是有一些适用于我所有模型的方法,例如
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的答案。
我仍然没有找到一个保持良好历史的宝石,但三分之二也不错......
答案 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)
。