2012-09-02 57 views
0

嗨,我是想在緩存memcached的查詢結果,但不幸的是,我無法做到這一點,因爲對象是一個ActiveRecord :: OrderedHash對象:轉換的ActiveSupport :: OrderedHash簡單的哈希

result = Car.where(:brand => 'BMW').order(:model_name).group(:model_name).count(:model_name) 
#=> {'120d' => 23, '316i' => 3, '525d' => 50} which is a ActiveRecord::OrderedHash if i ask .class 
Rails.cache.write('cached_result', result) 

這將返回以下錯誤:

編組錯誤的密鑰'cached_result':無法轉儲散列與默認proc 您試圖緩存不能序列化爲memcached的Ruby對象。 /Users/nk/.rvm/gems/[email protected]/gems/dalli-2.1.0/lib/dalli/server.rb:277:in`dump'

什麼是最好的/最簡單的做法來解決這個問題?

+0

你設置散列的默認值? –

+0

不是我所知道的 - 它應該像你詢問後一樣工作嗎? –

+1

我會這樣想 - 在1.9 [OrderedHash](https://github.com/rails/rails/blob/3-2-stable/activesupport/lib/active_support/ordered_hash.rb)只是哈希的一個子類並沒有真正添加任何東西 –

回答

0

這應該可以做到這一點。由於to_hash方法也返回一個OrderedHash對象,而不是一個Hash對象,我們必須採取不同的路線:

result = Car.where(:brand => 'BMW').order(:model_name).group(:model_name).count(:model_name) 

# make a simple array of the OrderedHash and put it in a "normal" one 
h = Hash[result.to_a] 
h.class # => Hash