我们正在开发具有类似于 Amazon DynamoDB 定价模型的 Rails 应用程序(即,灵活地提供您需要的东西)。为了简单起见,假设您可以配置:
- 用户数
- 您可以创建的文档数量
要求
简而言之,您根据您的配置付费。我们的具体要求如下:
- 您根据当月的最高金额支付月费。如果你3号升级到1000个用户,10号降级到500个,你就为1000个用户支付一整个月的费用。
- 您可以随时升级。
- 您可以每天降级一次。
(乍一看这可能听起来不公平,但我们在这里分配了一些重要的资源。)
我正在寻找一种方法来设计一个数据模型,它可以做我们想要的,而不会妨碍太多。
我考虑过的事情
审计宝石
据我所知,我不能使用像simple_audit或paper_trail这样的宝石。
它们在数据库中存储序列化的模型更改。这对于撤消和版本控制非常有用,但不适用于要求 #1,因为您无法在日期范围内获取更改然后找到 MAX 值(无需在 Ruby 中计算大部分)。
自制解决方案
我可以想象以下自制的解决方案:一个存储类似记录的数据库表
(model, metric, value, time_of_change, user_who_made_the_change)
这使得可以:
- 将所有更改集中在一个地方
- 查询一个日期范围内的最大值(需求#1)
- 查询何时允许下一次更改(要求 #3)
该表将在 ActiveRecord(假定after_save
)回调中更新,该回调包含在事务中save
。
由于NIH 综合症,我对自制解决方案感到担忧,也许我对审计宝石的担忧完全没有根据。
或者,只是也许,我忽略了一个方面或整个其他解决方案。你怎么看?