2017-05-18 19 views
0

我使用Rails 5.我有这个模型如何强制Rails使用我的缓存而不是始终访问数据库?

class MyObject < ActiveRecord::Base 
    ... 
    belongs_to :distance_unit 

和我注意到,当我有一个像下面

distance = Distance.new({:distance => my_obj.distance, :distance_unit => my_obj.distance_unit}) 

这将导致执行

SELECT "distance_units".* FROM "distance_units" WHERE "distance_units"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
如下的行

没有什么不寻常,但我已经在我的DistanceUnit模式创造出了高速缓存方法

class DistanceUnit < ActiveRecord::Base 

    def self.cached_find_by_id(id) 
    Rails.cache.fetch("distanceunit-#{id}") do 
     puts "looking for id: #{id}" 
     find_by_id(id) 
    end 
    end 

我想要“distance = Distance.new({:distance => my_obj.distance,:distance_unit => my_obj.distance_unit})”行来调用我的缓存功能,而不是跑到数据库。我怎样才能做到这一点?

+0

你用什么来存储缓存? – murb

+0

哦好问题。我在配置文件中有“config.cache_store =:memory_store”。 – Dave

回答

0

关于我的评论,请注意,memory_store仅用于进程内,因此每个进程都有自己的存储(如果这是一个问题,请考虑MemCacheStore)。过程结束时缓存也不存在了。

作为一般说明:belongs_to协会固有地触发查找如果对象尚未被提取。有很多建于Rails框架缓存和一般我不会太担心过早的优化在开始(当你发现查询速度太慢,只能优化)。

另外:访问缓存也是一个类型的数据库,并且基于可能索引ID的查找调用通常不是一个真正的重来电。如果只有几个距离单位,你可能只是使用一个常量可以工作?

但是,为了回答你的问题。似乎没有在你的代码的任何表示cached_find_by_id(同时轨道做了很多事情自动的,这是不是其中之一)。

您可以创建在MyObject下面的方法覆盖“吸气剂”是由belongs_to关联创建:

def distance_unit 
    DistanceUnit.cached_find_by_id(distance_unit_id) 
end 

不过,如果你只是初始化一个ActiveRecord对象,你不行需要在这个调用DistanceUnit你也可以直接通过ID,因为这是存储在数据库中。

Distance.new({:distance => my_obj.distance, :distance_unit_id => my_obj.distance_unit_id}) 
相关问题