Estoy intentando escribir una clase Ruby que funciona de manera similar al modelo de rieles AactiveRecord en la forma en que los atributos son manejados:atributos de clase de actualización de Rubí de hash cuando una propiedad cambia
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
Lo que quiero decir es que cuando init la clase, un hash de "atributos" se actualiza con los atributos relevantes:
>>> p = Person.new(:name => 'John', :age => 30)
>>> p.attributes
=> {:age=>30, :name=>"John"}
>>> p.attributes = { :name => 'charles' }
>>> p.attributes
=> {:age=>30, :name=>"charles"}
Hasta ahora todo bien. Lo que quiero que suceda es para los atributos de picadillo para actualizar cuando me puse una propiedad individual:
>>> 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"}
que podría hacerlo escribiendo un setter y getter para cada atributo en lugar de utilizar attr_accessor
, pero que a chupar de un modelo que tiene muchos campos ¿Alguna forma rápida de lograr esto?
En su método 'initialize', no necesita establecer atributos usando' send'. Simplemente actualice hash '@ attributes' en su lugar. Lo mismo aplica para el método 'attributes ='. –
Siento que esto sería lo suficientemente común como para que alguien pueda convertirlo en una gema simple. – NullVoxPopuli