2016-01-20 73 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