2016-01-20 61 views
0

我基本上想要在车辆模型中移动它。如何从模型中缓存整个活动记录模型?

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 

我在想这是一种重写内部查找方法的方法吗?但我不确定如何从内部访问模型。

回答

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 

上面将上Vehicle类定义find_cached。一个不应该干扰铁路内部,如find,除非这在不可避免的。

在这里,我们第一次尝试得到一个缓存值,然后使用where(注意,没有必要rescue因为where返回空数组,不像find),最后我们添加新发现的项目到缓存中。

+0

感谢。这很棒。可以使用self.find_cached而不是class << self?我对元编程不太熟悉。 –

+0

当然,'self.find_cached'和'Vehicle.find_cached'在这里都很好。 – mudasobwa

1

使用轨道缓存模型

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 
+0

注意:如果使用此模型和缓存的模型更改,则需要在模型更新上使用Rails.cache.delete来缓存缓存 – Austio