Creating a ruby class with mass assignment

R

Ruby Nooby

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", :eek:ther_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 :eek:ther_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?
 
R

Rupert Voelcker

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

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

Robert Klemme

2009/1/30 Ruby Nooby said:
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", :eek:ther_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 :eek:ther_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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top