处理模型 table 中的 expires_in 数据的最佳方式是什么

What is the best way to handle expires_in data in the model table

我有购买的许可证,并成为 user_licenses 用户在购买许可证时获得的许可证。许可证的有效期、费用、名称和描述都存储在许可证中 table.

购买许可证后,过期设置在 user_license (Date.now + License.expiration_years)

所以基本上用户许可证到期日期是:

UserLicense.expiration_date = Date.now + expires_in_days.days + expires_in_weeks.weeks + expires_in_months.months + expires_in_years.years

还有其他方法可以处理 expire_in_* 列吗?也许使用某种 jsonb 结构?

# license table:

      t.string :name, null: false
      t.string :description
      t.integer :amount, default: 0, null: false
      t.jsonb :details, default: {}, null: false
      t.boolean :hidden
      t.string :currency
      t.integer :expires_in_days, default: 0, null: false
      t.integer :expires_in_weeks, default: 0, null: false
      t.integer :expires_in_months, default: 0, null: false
      t.integer :expires_in_years, default: 0, null: false

如其他评论中所述,除非问题中未提及在数据库中存储特定 days/weeks/months/years 以备将来过期的正当理由,否则只需存储过期日期即可避免很多麻烦.

然后从这个日期开始你可以计算任何你想要的。

使用 Postgres interval type。此类型表示持续时间,例如:

INTERVAL '1 year 2 months 3 days'

Rails 已支持 the interval type natively since 6.1 and maps it to an ActiveSupport::Duration. You can use it in previous versions but you need to manually parse the string. If you want to advance a date from a duration you can use Time#advance:

# Three days, four hours and 30 minutes
Time.current.advance(
  ActiveSupport::Duration.parse("P3DT4H30M").parts
)

不仅如此,您还可以使用间隔以相对时间进行数据库查询而不会发疯。