rubyのclassでメンバ変数を一括でjson出力してRedisに登録する


はじめに

Redisでrubyのクラス情報を一気に登録したい場合について調査した。
jsonにして登録するのが良さそうとのことなので、classのメンバ変数をまとめて、json化したい

rubyのメンバ変数の一括取得

rubyのメンバ変数を一括で取得するのに、便利なメソッドがある。
http://ref.xaio.jp/ruby/classes/object/instance_variables

リファレンスの内容を以下に抜粋します。

instance_variables
class Book
  def initialize(title, price)
    @title = title; @price = price
  end
end

book = Book.new("Programming Ruby", 2000)
p book.instance_variables  # [:@title, :@price]

これを利用して、jsonでメンバ変数を一括出力出来ます。

jsonでのメンバ変数の一括出力

以下を参考にさせていただきました。
http://stackoverflow.com/questions/4464050/ruby-objects-and-json-serialization-without-rails

jsonでの一括出力
def to_json
    hash = {}
    self.instance_variables.each do |var|
        hash[var] = self.instance_variable_get var
    end
    hash.to_json
end
jsonからの復元
def from_json! string
    JSON.load(string).each do |var, val|
        self.instance_variable_set var, val
    end
end

redisへの登録

あとは、上記のto_jsonを用いてredisに登録するだけですね。
簡単のため、redisはローカルホストでポートは変更していないこととします。
先ほどのBookクラスに上記のto_jsonが実装されているものとします。

redisへの登録
book = Book.new("Programming Ruby", 2000)

redis = Redis.new
redis.set "book" book.to_json
redisからの復元
redis = Redis.new
book_json = redis.get "book"

book = Book.new
book.from_json! book_json

puts book.title # Programming Ruby
puts book.price # 2000