我的模型Thing
的属性rating
会随时间而变化。我希望能够查看任何Thing.rating
在给定日期的价值。
例如,如果{2015年1月13日@thing = Thing.first
和@thing.rating
等于5
,我希望能够在将来的某个日期返回该值。
我的一个想法是创建一个名为ThingPast
的新模型,该模型属于Thing
,而Thing
将具有_ {1}} ThingPast
。 ThingPast
具有thing_id
,rating
和date_created
属性。每天某个时间,Cron作业会为每个ThingPast
创建Thing
,只需复制rating
属性。
我认为这在技术上可行,但似乎不必要的复杂和低效。有谁知道更好,更简单的方法来实现这个目标?
答案 0 :(得分:2)
ratings
表格,其中包含rating
,thing_id
和created_at
列,以及thing_id
和created_at
上的索引。从rating
移除Thing
字段,并将其替换为
has_many :ratings, order: 'created_at desc'
将每个新的或更改的评分保存为ratings
表格中的新记录,例如after_save
回调。
将方法添加到Thing
,如:
def rating_at(rating_time)
ratings.where("created_at <= ?", rating_time).first.try(:rating)
end
并替换丢失的字段:
def rating
ratings.first.try(:rating)
end
现在,如果您想要每日评分,您可以迭代日期并为每个评分rating_at
:
(1..10).map { |days_ago| thing.rating_at(days_ago.days.ago) }.sort
不需要cron工作。
答案 1 :(得分:1)
您可以使用paper_trail
gem https://github.com/airblade/paper_trail;它保留了您的模型的版本。它存储了您在versions
表中选择的所有模型版本,并且与模型具有多态关系。
您可以通过查询版本表
获取所需的每日版本PaperTrail::Version.where(item: Thing.first, created_at: Date.yesterday)
将在那个日期为您提供模型版本