我找到了这篇文章:Override a Mongoid model's setter and getters来帮助我,但行为仍然不是我想要的。
我的模型是这样的:
class Event
include Mongoid::Document
include IceCube
validates_presence_of :title
field :title, type: String
field :description, type: String
field :schedule, type: Hash
attr_protected :schedule_hash
def schedule=(new_schedule)
super(new_schedule.to_hash)
end
def schedule
Schedule.from_hash(super())
end
end
这或多或少像我预期的那样工作,因为它序列化和反序列化 IceCube 对象,但我注意到虽然我可以这样做:
s = Schedule.new(Time.now)
s.add_recurrence_rule Rule.daily
e = Event.new
e.schedule = s
它似乎像我期望的那样序列化和反序列化,我可以称之为
e.schedule.occurs_at?(Date.today + 1.day)
并得到预期的响应。但是,如果我尝试:
e.schedule.add_recurrence_rule Rule.daily
s
而不是在将属性设置为 on 之前在局部变量上调用它event
,我可以查看哈希并查看规则未保留。
在 Ruby 或 Mongoid 中做这种事情的正确方法上我是否缺少一些东西?
我尝试使用 write_attribute 和 read_attribute,但这同样无济于事。