我有一个模型Thing
,其属性 rating
会随着时间的推移而变化。我希望能够查找任何 Thing. rating
在给定日期的值(value)。
例如,如果 2015 年 1 月 13 日 @thing = Thing.first
和 @thing. rating
等于 5
,我想能够在未来的任何日期返回该值。
我的一个想法是创建一个名为 ThingPast
的新模型,该模型将属于 Thing
,而 Thing
将拥有多个 ThingPast
。 ThingPast
将具有属性 thing_id
、 rating
和 date_created
。每天的某个时间,Cron 作业将为每个 Thing
创建一个 ThingPast
,并仅复制 rating
属性。
我认为这在技术上可行,但似乎不必要地复杂且低效。有谁知道更好、更简单的方法来实现这一点?
最佳答案
- 添加一个
ratings
表,其中包含rating
、thing_id
和created_at
列以及上的索引thing_id
和created_at
。 从
Thing
中删除rating
字段并将其替换为has_many :ratings, order: 'created_at desc'
将每个新的或更改的评级保存为
评级
表中的新记录,例如使用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 作业。
关于ruby-on-rails - 有没有更好的方法来记录每天某个属性的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31734936/