Я пытаюсь написать класс Ruby, который работает аналогично модели Rails AactiveRecord в том, что атрибуты обрабатываются:Update рубин атрибуты класса хэш, когда свойство изменяет
class Person
attr_accessor :name, :age
# init with Person.new(:name => 'John', :age => 30)
def initialize(attributes={})
attributes.each { |key, val| send("#{key}=", val) if respond_to?("#{key}=") }
@attributes = attributes
end
# read attributes
def attributes
@attributes
end
# update attributes
def attributes=(attributes)
attributes.each do |key, val|
if respond_to?("#{key}=")
send("#{key}=", val)
@attributes[key] = name
end
end
end
end
Что я имею в виду, что, когда я init класс, хеш атрибутов обновляется с соответствующими атрибутами:
>>> p = Person.new(:name => 'John', :age => 30)
>>> p.attributes
=> {:age=>30, :name=>"John"}
>>> p.attributes = { :name => 'charles' }
>>> p.attributes
=> {:age=>30, :name=>"charles"}
Пока все хорошо. То, что я хочу, чтобы это произошло для атрибутов хэш для обновления, когда я установил индивидуальную собственность:
>>> p.attributes
=> {:age=>30, :name=>"John"}
>>> p.name
=> "John"
>>> p.name = 'charles' # <--- update an individual property
=> "charles"
>>> p.attributes
=> {:age=>30, :name=>"John"} # <--- should be {:age=>30, :name=>"charles"}
Я мог бы сделать это, написав и присваивателя для каждого атрибута вместо attr_accessor
, но это будет сосать для модель, в которой много полей. Любой быстрый способ сделать это?
В вашем методе 'initialize' вам не нужно устанавливать атрибуты с помощью' send'. Просто обновите хэш '@ attributes'. То же самое касается метода 'attributes ='. –
Я чувствую, что это было бы достаточно распространено, когда кто-то мог превратить его в простой драгоценный камень. – NullVoxPopuli