使用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?
答案 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