【问题标题】:How to cache the entire active record model from inside the model?如何从模型内部缓存整个活动记录模型?
【发布时间】:2016-04-26 08:52:42
【问题描述】:

我基本上是想把它移到车辆模型中。

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

我在想有一种方法可以覆盖内部 find 方法吗?但我不确定如何从其内部访问模型。

【问题讨论】:

    标签: ruby-on-rails ruby caching activerecord


    【解决方案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。不应干涉 Rails 的内部结构,例如 find,除非这是不可避免的。

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

    【讨论】:

    • 谢谢。这很棒。使用 self.find_cached 代替 class
    • 当然,self.find_cachedVehicle.find_cached 都可以。
    【解决方案2】:

    在模型中使用 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
    

    【讨论】:

    • 注意:如果你使用这个并且你缓存的模型发生了变化,你需要在模型更新时使用 Rails.cache.delete 来破坏缓存
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多