如何为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发布于 2011-07-10 09:23:23
attribute class method from 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调用赋值方法,如下所示:
@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-09-11 19:45:37
默认情况下,[]和[]=作为动态属性访问器和赋值器在OHM0.2的Ohm::Model中定义。
https://stackoverflow.com/questions/6638375
复制相似问题