ice_cube gem配置多重复规则时如何设置全局计数限制
ice_cube 多重复规则设置全局总发生次数限制方案
ice_cube的count限制是单条重复规则(RRULE)维度的校验属性,本身不支持直接在Schedule层级配置跨规则的全局总发生次数。你当前给每条规则单独配置count(7),执行时两条规则会各自计数,最终自然会返回合计14条记录。
可以通过以下两种方案实现全局总次数限制:
方案1:直接取指定数量的发生记录(性能最优,推荐日常使用)
移除所有单条规则上的.count()调用,不要使用all_occurrences拉取全量数据,直接调用first(n)方法获取需要的总条数即可。ice_cube内部会在收集到足够数量的发生记录后自动终止遍历,性能和单规则配置count没有差异,示例代码:schedule = IceCube::Schedule.new(Time.utc(2022, 6, 20, 12, 0, 0)) # 每周二重复,不配置单规则计数 schedule.add_recurrence_rule(IceCube::Rule.weekly.day(3)) # 每隔一周的周三重复,不配置单规则计数 schedule.add_recurrence_rule(IceCube::Rule.weekly(2).day(4)) # 直接获取合计前7条记录,即全局总次数7次的效果 total_occurrences = schedule.first(7)方案2:设置全局调度终止时间(适合序列化存储场景)
如果你需要把调度规则序列化后持久化存储(比如存入数据库,后续加载不需要额外代码处理就能得到正确的次数),可以先算出第N次发生的时间点,将其设置为整个调度的结束时间,后续所有查询都会自动返回该时间点之前的记录,合计正好是你要的总次数,示例代码:schedule = IceCube::Schedule.new(Time.utc(2022, 6, 20, 12, 0, 0)) schedule.add_recurrence_rule(IceCube::Rule.weekly.day(3)) schedule.add_recurrence_rule(IceCube::Rule.weekly(2).day(4)) # 取第7次发生的时间作为整个调度的终止点 global_end_time = schedule.first(7).last schedule.end_time = global_end_time配置完成后,不管调用
all_occurrences还是其他发生时间查询方法,都只会返回7条记录,序列化后的调度结构会自带全局end_time属性,加载后无需额外截断处理。
注意:不要在移除单规则count后直接调用
all_occurrences再手动截断数组——无终止时间/无计数的无限重复规则会让all_occurrences持续遍历直到内存耗尽,必须用first(n)方法做限量查询。
内容的提问来源于stack exchange,提问作者rogeryc
相关产品推荐
相关产品推荐

