2

如何为 Ohm 对象动态设置字段?

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
4

2 回答 2

3

来自的attribute类方法Ohm::Model为命名属性定义了访问器和修改器方法:

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

因此,当您说 时attribute :foo,您将免费获得这些方法:

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

您可以send像这样调用 mutator 方法:

@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
于 2011-07-10T01:23:23.463 回答
0

[]在 Ohm 0.2 的 Ohm::Model中[]=默认定义了动态属性访问器和修改器。

于 2011-09-11T11:45:36.903 回答