ActiveRecord范围缓存的远程属性?

时间:2015-01-04 09:54:39

标签: ruby-on-rails ruby caching scope rails-activerecord

我有一个大型项目,有几个独立的数据库实例,数据库名称和不同的表名,都需要在单个Sinatra控制器中进行处理。

像这样的东西

class ItemLog < ActiveRecord::Base
  def address
    http_get('http://x.com/get_address_by_item_type?id=' + self.type_id).to_json['address']
  end
end

所以,如果我遍历一长串的ItemLog,那么每次ItemLog 都会多次调用

但由于ItemLog.type_id是一个有限集,但它保存在远程数据库中,因此对于每个唯一type_id,我们只需要发出一个http请求。

我知道如何为这样的缓存声明一个独立的哈希:

address_cache = Hash[ItemLog.where(...).limit(500).pluck(:type_id).uniq.map {|type_id| [type_id, get_address(type_id)] }]
ItemLog.where(...).limit(500).each { |item| item.address = address_cache[item.type_id }

我的问题是,无论如何要为此编写更优雅的代码?像“scope cache”这样的东西就像{item_type_id:address_string}对,但是直接在封装的ActiveRecord模型中

0 个答案:

没有答案