Sto cercando di scrivere una classe di Ruby che funziona in modo simile al modello di Rails AactiveRecord nel modo in cui vengono gestiti gli attributi:classe Aggiornamento Rubino attribuisce hash quando una proprietà 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
Quello che voglio dire è che quando ho init della classe, un "attributi" hash viene aggiornato con i relativi attributi:
>>> p = Person.new(:name => 'John', :age => 30)
>>> p.attributes
=> {:age=>30, :name=>"John"}
>>> p.attributes = { :name => 'charles' }
>>> p.attributes
=> {:age=>30, :name=>"charles"}
Fin qui tutto bene. Quello che voglio che accada è per gli attributi di hash per aggiornare quando ho impostato una proprietà individuale:
>>> 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"}
potevo farlo scrivendo un setter e getter per ogni attributo invece di utilizzare attr_accessor
, ma che ti succhiano per un modello che ha molti campi. Qualche modo veloce per realizzare questo?
Nel metodo 'initialize', non è necessario impostare gli attributi utilizzando' send'. Semplicemente aggiorna l'hash '@ attributes'. Lo stesso vale per il metodo 'attributes ='. –
Credo che questo sarebbe abbastanza comune in cui qualcuno potrebbe trasformarlo in una gemma semplice. – NullVoxPopuli