Rails7中使用ice_cube gem调用occurring_at?方法时出现NoMethodError
问题根源
你当前的实现只是将IceCube::Schedule转为哈希后序列化存储,读取时得到的是Ruby哈希(或字符串),而非IceCube::Schedule实例,自然无法调用ice_cube的专属方法。
正确实现方式
需要让Rails直接序列化/反序列化IceCube::Schedule实例,而非先转成哈希,具体步骤如下:
替换模型的序列化配置
移除serialize :schedule, Hash,改用自定义序列化逻辑,让Rails能直接处理IceCube::Schedule实例:class Batch < ApplicationRecord require "ice_cube" require "active_support/time" # 存储时将IceCube实例转为JSON字符串 def schedule=(schedule) if schedule.is_a?(IceCube::Schedule) write_attribute(:schedule, schedule.to_json) else super(schedule) end end # 读取时将JSON字符串还原为IceCube实例 def schedule raw_value = read_attribute(:schedule) raw_value.present? ? IceCube::Schedule.from_json(raw_value) : nil end end调整create_schedule方法
无需手动转哈希,直接赋值IceCube::Schedule实例即可:def create_schedule self.schedule = IceCube::Schedule.new(start_time) do |s| # 这里添加你的重复规则,示例: s.add_recurrence_rule IceCube::Rule.daily end end验证效果
保存后在控制台测试:batch = Batch.last batch.schedule.class # 应返回 IceCube::Schedule batch.schedule.occurring_at?(Time.now) # 可正常调用ice_cube方法
补充说明
- 你的
schedule字段为text类型,完全可以存储JSON字符串,无需修改字段类型。 - 若想使用Rails原生
serialize方法,也可直接指定序列化类:
这种方式依赖ice_cube实现Rails的序列化协议,部分版本可能存在兼容性问题,自定义序列化的方式更稳定。serialize :schedule, IceCube::Schedule
内容的提问来源于stack exchange,提问作者Thibaud Clement
相关产品推荐
相关产品推荐

