我将用户会话密钥存储在名为 skey 的列中的Rails活动记录模型中。必须通过外部API调用每10分钟获取 skey ,但是直到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。
有关如何解决此问题的任何建议?或者,如果有更好的方法来接近我想要做的事情,我很想知道。感谢。
答案 0 :(得分:2)
使用update_columns
代替update_attribute
。更新将直接发出更新查询,而不是使用getter
def skey_valid?
(Time.now - self.skey_used_at) < 7.minutes
end
def skey
unless skey_valid?
_skey = authenticate #external API call
return nil unless _skey
update_columns(:skey => _skey)
end
update_columns(:skey_used_at => Time.now)
return read_attribute(:skey)
end