2013-05-15 18 views
1

我使用Redis的對象::獲得從Redis的哈希表示::對象

https://github.com/nateware/redis-objects

我想修改類的演講之前,我將對象轉換爲JSON,所以我想do是合併在一個鍵中,但不必管理演示者中的redis對象類的訪問器。

class MyOb 
    include Redis::Objects 

    value :foo 
    value :bar 
end 

myob = new MyOb 
myob.foo = "foo" 
# I can do 
myob.to_json #=> valid string with foo and bar keys 
# what i want 
myob.to_h #=> {foo: "foo", bar: nil} 
# so i can 
myob.to_h.merge(baz: "baz"}.to_json 

我還沒有發現任何東西,讓我像表示,所以如果你知道魔術API醬我很想聽到它。 謝謝!

+0

首先編輯我的答案:而不是轉換爲散列並重新轉換爲JSON不是更好地實現在'MyOB'合併類似的方法,使用JSON值?像你的代碼的最後一行中的'myob.merge(valid_json)' – byterussian

回答

1

你可以破解低效像這樣:

class MyOb 
    def to_h 
    JSON.parse(self.to_json) 
    end 
end 

[編輯]或者你可以做到這一點,所以你不必跟蹤在多個地方鍵:

class MyOb 
    def to_h 
    Hash[MyOb.redis_objects.map { |k,_| [k, self.send(k)] }] 
    end 
end 
+0

這絕對是一種選擇,但是爲了解析它而解析一種方法似乎是浪費。似乎在to_json從其獲取信息的api中必須有一個位置。第二種解決方案正在做我想避免的事情,這是不得不擔心在兩個地方聲明密鑰。不過謝謝。 –

+0

@JedSchneider:redis對象是否爲擴展對象提供了一種列出其Redis值(例如聲明爲:foo,:bar等)的方法? – maerics

+0

不是我所知道的,這是我尋求的解決方案的一部分。謝謝! –

0
require 'json' 

class MyOb 
    include Redis::Objects 

    value :foo 
    value :bar 

    def to_h 
    JSON.parse(self.to_json) 
    end 
end