2011-07-10 4 views
2

オームオブジェクトのフィールドを動的に設定するにはどうすればよいですか?オーム/レディスの動的フィールドの設定

class OhmObj < Ohm::Model 
    attribute :foo 
    attribute :bar 
    attribute :baz 

    def add att, val 
    self[att] = val 
    end 
end 

class OtherObj 

    def initialize 
    @ohm_obj = OhmObj.create 
    end 

    def set att, val 
    @ohm_obj[att] = val #doesn't work 
    @ohm_obj.add(att, val) #doesn't work 
    end 
end 

答えて

3

attribute class method from Ohm::Modelという名前の属性のアクセサとミューテータメソッドを定義します。あなたはattribute :fooを言うとき

def self.attribute(name) 
    define_method(name) do 
    read_local(name) 
    end 

    define_method(:"#{name}=") do |value| 
    write_local(name, value) 
    end 

    attributes << name unless attributes.include?(name) 
end 

だから、あなたは自由のためにこれらのメソッドを取得します:

def foo   # Returns the value of foo. 
def foo=(value) # Assigns a value to foo. 

あなたはsendを使用することができますこのようなミューテータメソッドを呼び出す:

@ohm_obj.send((att + '=').to_sym, val) 

あなたが本当に@ohm_obj[att] = valあなたはあなたのOhmObjクラスに次のようなものを追加でき言いたい場合:

def []=(att, value) 
    send((att + '=').to_sym, val) 
end 

をそして、あなたはおそらく、対称性を維持するためにもアクセサバージョンをしたいと思います:

def [](att) 
    send(att.to_sym) 
end 
+0

「to_sym」は余分です。 – tribalvibes

0

[]および[]=は、デフォルトではOhm :: Model in Ohm 0.2で定義されています。

関連する問題