记录状态转换

时间:2018-04-11 21:08:31

标签: ruby-on-rails ruby activerecord state-machine

我们有一个Rails应用程序,其Subscription模型的字段为status字符串。值包括activecanceleddunning等等。

我们不记录status何时从一个州过渡到另一个州,但我想。我的挑战在于考虑如何轻松回答这个问题:

“3个月前订阅的是active?”

我可以使用以下代码创建subscription_status_transitions的表格。

  • subscription_id
  • status
  • transitioned_at

为了回答上面的问题,似乎我必须得到第一个status的<有问题的日期(3个月前)?

有没有更好的方法记录这种事情来轻松回答这个问题?

1 个答案:

答案 0 :(得分:1)

我可以看到两种替代解决方案:事件采购和临时表

通过事件采购,您将记录有关状态更改的事件,并根据事件列表构建Subscription状态。要获取历史状态,您只需查询事件,直到您感兴趣的时间点为止。它与你描述的非常相似。

您还可以使用时态表并在订阅状态(或整个订阅)有效时保留时间戳(valid_tovalid_from)。您不必更新行,而是插入新行并在旧版本中设置valid_to时间戳。您只需查询具有valid_from < $date AND valid_to > $date的子选项。关于wiki的更多细节 - 它是一个很好的首发。