处理模型 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
)
不仅如此,您还可以使用间隔以相对时间进行数据库查询而不会发疯。
我有购买的许可证,并成为 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
)
不仅如此,您还可以使用间隔以相对时间进行数据库查询而不会发疯。