【发布时间】:2014-04-12 04:39:52
【问题描述】:
我将用户会话密钥存储在 Rails 活动记录模型中名为 skey 的列中。 skey 必须通过外部 API 调用每 10 分钟获取一次,但在 10 分钟过去之前,我想缓存 skey 并返回缓存的值。这是我得到的:
def skey_valid?
(Time.now - self.skey_used_at) < 7.minutes
end
def skey
if skey_valid? == false
_skey = authenticate #external API call
if _skey.nil?
return nil
end
update_attribute :skey, _skey
end
update_attribute :skey_used_at, Time.now
return self[:skey]
end
现在的问题是当我调用 User.skey 时,它进入了一个无限循环并且堆栈溢出。显然,当我执行 update_attribute :skey, _skey 时,我的自定义 skey 函数被调用,该函数再次调用 update_attribute :skey, _skey。
关于如何解决这个问题的任何建议?或者,如果有更好的方法来解决我正在尝试做的事情,我很想知道。谢谢。
【问题讨论】:
-
顺便说一句,我维护了一个名为
volatile_hash的 gem,它对哈希执行类似的操作。
标签: ruby-on-rails caching activerecord lazy-loading