Rails使用另一列覆盖updated_at以获取正确的cache_key

时间:2014-02-04 19:00:52

标签: ruby-on-rails-3 caching

使用Rails 3.2.13。 我们使用last_modified_time作为我们上次更新的列。我的问题是,当我model.cache_key时,它没有考虑:last_modifed_time列。

Rails中的当前(Rails 3.2.13)实现:

# Returns a cache key that can be used to identify this record.
#
# ==== Examples
#
#   Product.new.cache_key     # => "products/new"
#   Product.find(5).cache_key # => "products/5" (updated_at not available)
#   Person.find(5).cache_key  # => "people/5-20071224150000" (updated_at available)
def cache_key
  debugger
  case
  when new_record?
    "#{self.class.model_name.cache_key}/new"
  when timestamp = self[:updated_at]
    timestamp = timestamp.utc.to_s(cache_timestamp_format)
    "#{self.class.model_name.cache_key}/#{id}-#{timestamp}"
  else
    "#{self.class.model_name.cache_key}/#{id}"
  end
end

在我的模型中覆盖它如下:

def cache_key
  updated_at = self[:updated_at]

  if self.last_modified_time && !updated_at
    timestamp = self.last_modified_time.utc.to_s(cache_timestamp_format)
    "#{super}-#{timestamp}"
  end
end

我的问题是:是否有更简单的方法来覆盖:updated_at以获取正确的cache_key?

2 个答案:

答案 0 :(得分:0)

我刚遇到同样的问题。这不一定更简单,但如果您计划升级到Rails 4,您只需在模型中覆盖此方法:

private
  def timestamp_attributes_for_update
    super << :last_modifed_time
  end

不幸的是,正如您所发现的,由于Rails 3对cache_key中的:updated_at值进行了硬编码,因此该解决方案不起作用。但是,这已在Rails 4中修复。

答案 1 :(得分:0)

在rails 5中,timestamp_attributes_for_update是一个类方法,仅接受字符串值而不是符号,因此您可以在模型中做到这一点:

private

  def self.timestamp_attributes_for_update
    super << "last_modified_time" # must be string
  end