2009/1/30 Ruby Nooby <uslxycdabssmy / mailinator.com>:
> 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:in `new'
>        from (irb):19
>
> What is the best way of achieving mass assignment whilst still allowing
> 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)
=> #<struct Test foo=1, bar=nil, baz=nil>
irb(main):007:0> Test.create(:bar => 3, :foo => 123)
=> #<struct Test foo=123, bar=3, baz=nil>

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end