2016-11-23 65 views
0

如何在Rails查詢中緩存數據庫導致的列表?如何在Rails查詢中緩存數據庫導致的列表

@total_untagged = Rails.cache.fetch("tags_controller/untagged/@total_untagged", expires_in: 1.hour) do 
     InventoryApi::BaseEntity\ 
      .joins(@object_type.to_sym) 
      .includes(:base_entities_tags) 
      .where({ base_entities_tags: { base_entity_id: nil }}) 
      .size.to_int 
     end 

此代碼加載InventoryApi :: BaseEntity模型,並用一個密鑰值保存在高速緩存中:

tags_controller/untagged/@total_untagged 

緩存的結果是一個實例,從數據庫中懶洋洋地加載,不是作爲具有字段值的類來急切加載的。

一旦它被懶惰地加載,當讀取緩存時,它需要再次讀取數據庫,實際上,我沒有獲得任何緩存。

如何緩存最終結果,而不是數據庫關係?

回答

0

一旦它保存在緩存中,它不需要再次讀取數據庫,直到緩存失效。如果你在本地使用,你應該記住這一點。這是從http://guides.rubyonrails.org/caching_with_rails.html

爲了充分利用本地緩存,您需要在本地環境中啓用緩存,方法是在相關的config/environments/*。rb中將config.action_controller.perform_caching設置爲true。

更改config.action_controller.perform_caching的值只會影響Action Controller組件提供的緩存。例如,它不會影響低級緩存。

+0

感謝您的回答,但我的問題與此無關。我知道一旦保存在緩存中,就沒有必要回到數據庫中,這就是我想要的,但緩存的內容不是數據本身,而是數據庫加載器,因此,一旦從緩存中讀取,數據需要再次從數據庫加載,並且是我想要避免的事情。 我已經更改了配置文件,緩存正在保存和使用,但正如我所說,beeing保存的不是我所需要的。 –

+0

如果是這樣,那麼爲什麼不緩存從數據庫收到的確切結果,通過獲取它而不是關係。 – VishalTheBeast

+0

我在問怎麼做。這是我的問題。 –

相關問題