延迟加载/缓存Ruby模型属性?

时间:2014-03-09 00:54:12

标签: ruby-on-rails caching activerecord lazy-loading

我将用户会话密钥存储在名为 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。

有关如何解决此问题的任何建议?或者,如果有更好的方法来接近我想要做的事情,我很想知道。感谢。

1 个答案:

答案 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