2011-07-18 10 views
3

私はYamlファイルによって生成されたハッシュからオブジェクトを作成することに興味があります。Ruby:ハッシュからのメタプログラミング方法

YAMLファイルは次のようなものになります。だから、

foos: 
    first: 
    code: f 
    name: The First Foo 
    icon: path/to/file.png 
    second: 
    code: s 
    name: The Second Foo 
    icon: path/to/file.png 
bars: 
    dive: 
    code: d 
    name: Dive Bar 
    location: 100 Main St. 
    college: 
    code: c 
    name: College Bar 
    location: 100 University Ave. 

を、YAMLファイルは、基本的なカテゴリに属している属性のセットを定義します。 カテゴリには名前(foos、bars)があり、各属性には少なくともコードと名前があります。

私は、カテゴリの名前を単純なオブジェクトとしてそのカテゴリ内のアイテムを呼び出すことのできるメソッドに変換する「属性」モデルを作成したいと考えています。

私のような何かを行うことができるようにしたい:

Attributes = Attributes.new(...yaml_file...) 
Attributes.foos #returns an array of foos 
Attributes.foo(:f) #returns the foo with a code (f) 
Attributes.foo(:s).name #returns "The Second Foo" 

私は一種のこのアプローチする方法として失われています。

私はインスタンス変数にハッシュをロードするために私のアトリビュートモデルを設定する方法を知っていますが、私はそのハッシュのキーを使ってキーの名前を付けてパスする各カテゴリの個々のアイテムにオブジェクトのハッシュを作成して、これらをドット構文で連鎖させることができます。

ハッシュと私はすでに

attributes[:foos][:first][:icon] 

を行うことができます。しかし、私は属性に他の有用なメソッドを追加することができます出発点として、このモデルからハッシュを使用したいことを私は承知しています後でモデル化する。また、私はかなり新しいルビーです。私は本当にこれを行うためにこのようなことをする方法を学びたいと思っています。

ありがとうございました!

+0

[Struct](http://ruby-doc.org/core/classes/Struct.html)を使用してクラスを構築したことがありますか? –

+0

ええ、私はそれについて考えていました... Structsにはあまりよく知られていません。 – Andrew

答えて

1

モデルが処理され、ハッシュのハッシュに格納されていると仮定すると、method_missingを使用してスキームを実装できます。

class Attributes { 
    def init(*args) { 
    @hash = # .... 
    } 
    def method_missing(symbol, *args) 
    result = @hash[symbol] 
    if (result && args.length) { 
     return result[args[0]] 
    } 
    return result 
    } 
} 
関連する問題