Я играл с той же самой вещью, и я думаю, что я нашел довольно простой способ проверить redis для кэшированного объекта сначала. Это будет работать только когда вы используете метод поиска, но для моих нужд я думаю, что этого достаточно.
Переопределив find, я могу проверить контрольную сумму аргументов, чтобы увидеть, сохранен ли ответ в redis. Если я это сделаю, я могу извлечь ответ JSON из redis и создать новый объект прямо здесь. Если я этого не сделаю, я передам поиск в ActiveResource :: Base, и произойдет обычное действие.
Я еще не реализовал сохранение ответов в redis с помощью ActiveResource, но я планирую заполнить эти кеши в других местах. Таким образом, обычно я могу положиться на то, что мои кеши есть, но если нет, я могу прибегнуть к API.
class MyResource < ActiveResource::Base
class << self
def find(*arguments)
checksum = Digest::MD5.hexdigest(arguments.md5key)
cached = $redis.get "cache:#{self.element_name}:#{checksum}"
if cached
return self.new JSON.parse(cached)
end
scope = arguments.slice!(0)
options = arguments.slice!(0) || {}
super scope, options
end
end
end
и небольшой патч, чтобы мы могли получить ключ md5 для нашего массива:
require 'digest/md5'
class Object
def md5key
to_s
end
end
class Array
def md5key
map(&:md5key).join
end
end
class Hash
def md5key
sort.map(&:md5key).join
end
end
Это помогает?