Creating a ruby class with mass assignment

Hi,
How do I create a ruby class that has mass assignment functionality? I
want it to work in a similar way to the way in which ActiveRecord does,
ie.
MyClass.new
=> #MyClass:
MyClass.new(:name => “Cool class”)
=> #<MyClass: @name=“s”>
MyClass.new(:name => “Cool class”, :other_attribute => “some other”)
=> #<MyClass: @name=“s”, @other_attribute=“some other”>

I have found the following code snippit which works for the mass
assignment part but doesn’t work if I initialize the class without any
arguments:

class MyClass
attr_accessor :name
attr_accessor :other_attribute

def initialize(args)
args.keys.each { |name| instance_variable_set “@” + name.to_s,
args[name] }
end
end

MyClass.new
ArgumentError: wrong number of arguments (0 for 1)
from (irb):19:in initialize' from (irb):19:innew’
from (irb):19

What is the best way of achieving mass assignment whilst still allowing
to initialize without parameters?

What is the best way of achieving mass assignment whilst still allowing
to initialize without parameters?

def initialize(args = {})
args.keys.each { … }
end

2009/1/30 Ruby N.y [email protected]:

args[name] }
to initialize without parameters?
You can make your life considerably easier by using Struct:

irb(main):001:0> Test = Struct.new :foo, :bar, :baz do
irb(main):002:1* def self.create(h = {})
irb(main):003:2> new(*members.map {|m| h[m.to_sym]})
irb(main):004:2> end
irb(main):005:1> end
=> Test
irb(main):006:0> Test.create(:foo => 1)
=> #
irb(main):007:0> Test.create(:bar => 3, :foo => 123)
=> #

Kind regards

robert