如何从模型内部缓存整个活动记录模型?

时间:2016-01-20 13:21:48

标签: ruby-on-rails ruby caching activerecord

我基本上想要将其移到车辆模型中。

vehicle = @vehicle_cache.get(event[:mac_address])

unless vehicle
        begin
            vehicle = Vehicle.where('ID = ?',event[:mac_address]).first
        rescue
            vehicle = nil
        end
        @vehicle_cache.add(event[:mac_address],vehicle)
end

我认为这是一种覆盖内部查找方法的方法吗?但我不确定如何从内部访问模型。

2 个答案:

答案 0 :(得分:1)

class Vehicle
  class << self
    def find_cached event_mac_address
      @vehicle_cache.get(event_mac_address) || \
        where('ID = ?', event_mac_address).first.tap do |vehicle|
          @vehicle_cache.add(event_mac_address, vehicle) if vehicle
        end
    end
  end
end

以上内容将在find_cached课程中定义Vehicle。除非这是不可避免的,否则不应干涉导轨内部,例如find

我们首先尝试获取缓存值,然后使用where(注意,rescue不需要where,因为find返回空数组,与{{1}}不同)最后我们将新找到的项添加到缓存中。

答案 1 :(得分:1)

在模型中使用rails缓存

def cached_mac_address_fetch(mac_address)
  Rails.cache.fetch([self, 'mac_address'], expires_in: 12.hours) do
    Vehicle.where('ID = ?', mac_address).first_or_create
  end
end