Ich versuche, eine Ruby-Klasse zu schreiben, die ähnlich wie Rails AactiveRecord Modell in der Art und Weise funktioniert, dass Attribute gehandhabt werden:Update-Ruby-Klasse Attribute Hash, wenn eine Eigenschaft ändert
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
Was ich meine ist, dass, wenn ich Initiiere die Klasse, ein "Attribut" -Hash wird mit den relevanten Attributen aktualisiert:
>>> p = Person.new(:name => 'John', :age => 30)
>>> p.attributes
=> {:age=>30, :name=>"John"}
>>> p.attributes = { :name => 'charles' }
>>> p.attributes
=> {:age=>30, :name=>"charles"}
So weit so gut. Was ich will, geschehen ist für die Attribute zu aktualisieren Hash, wenn ich eine individuelle Eigenschaft:
>>> 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"}
ich, dass für jedes Attribut durch das Schreiben einen Setter und Getter tun könnte stattdessen attr_accessor
zu verwenden, aber das wird saugen für ein Modell mit vielen Feldern. Jeder schnelle Weg, dies zu erreichen?
In Ihrer 'initialize' Methode müssen Sie keine Attribute mit' send' einstellen. Aktualisiere stattdessen einfach den '@ attributes' Hash. Dasselbe gilt für 'attributes =' method. –
Ich denke, das wäre genug, wo jemand es zu einem einfachen Juwel machen könnte. – NullVoxPopuli