Метод класса 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
для вызова метода мутатора следующим образом:
@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