ruby-on-rails - 有没有更好的方法来记录每天某个属性的值?

标签 ruby-on-rails ruby performance cron

我有一个模型Thing,其属性 rating会随着时间的推移而变化。我希望能够查找任何 Thing. rating 在给定日期的值(value)。

例如,如果 2015 年 1 月 13 日 @thing = Thing.first@thing. rating 等于 5,我想能够在未来的任何日期返回该值。

我的一个想法是创建一个名为 ThingPast 的新模型,该模型将属于 Thing,而 Thing 将拥有多个 ThingPast ThingPast 将具有属性 thing_id ratingdate_created。每天的某个时间,Cron 作业将为每个 Thing 创建一个 ThingPast,并仅复制 rating 属性。

我认为这在技术上可行,但似乎不必要地复杂且低效。有谁知道更好、更简单的方法来实现这一点?

最佳答案

  • 添加一个 ratings 表,其中包含 ratingthing_idcreated_at 列以及 上的索引thing_idcreated_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/

相关文章:

mysql - HQL/MySQL 用于列出不同项和重复项

ruby-on-rails - 如何使用康康康?

ruby-on-rails - rails ,acts_as_taggable_on : how to get all aricles without tags

ruby-on-rails - 为不起作用的模型创建种子数据

ruby - 你期待哪个 ruby​​ 解释器?

ruby - 为什么不 >> 在 Ruby 中添加字符串?

ruby-on-rails - 在 Rails 中初始化 class_attribute 的正确方法是什么?

ruby-on-rails - 重新创建我的 database.yml 文件

c# - 为什么调用 PerformanceCounter 很慢?

performance - 在拖动事件期间 GWT 更改样式花费的时间太长