On Thu, 2012-09-06 at 14:36 +0200, Michal Fojtik wrote: > On Sep 6, 2012, at 1:30 AM, David Lutterkort <[email protected]> wrote: > > > On Wed, 2012-09-05 at 15:15 +0200, [email protected] wrote: > >> From: Michal Fojtik <[email protected]> > >> > >> * This should fix DTACLOUD-311 > >> > >> Signed-off-by: Michal fojtik <[email protected]> > >> --- > >> server/lib/cimi/models/schema.rb | 6 ++---- > >> 1 file changed, 2 insertions(+), 4 deletions(-) > >> > >> diff --git a/server/lib/cimi/models/schema.rb > >> b/server/lib/cimi/models/schema.rb > >> index 088e111..a7dc0f2 100644 > >> --- a/server/lib/cimi/models/schema.rb > >> +++ b/server/lib/cimi/models/schema.rb > >> @@ -140,11 +140,9 @@ class CIMI::Model::Schema > >> def struct > >> cname = "CIMI_#{json_name.upcase_first}" > >> if ::Struct.const_defined?(cname) > >> - ::Struct.const_get(cname) > >> - else > >> - ::Struct.new("CIMI_#{json_name.upcase_first}", > >> - *@schema.attribute_names) > >> + ::Struct.send(:remove_const, "CIMI_#{json_name.upcase_first}") > >> end > >> + ::Struct.new("CIMI_#{json_name.upcase_first}", > >> *@schema.attribute_names) > > > > Nice catch - instead of defining a constant Struct::Foo and then > > undefining it, and continually defining new classes, we should just save > > it in an instance variable, i.e. do the following > > > > def struct > > @struct_class ||= Struct.new(nil, *@schema.attribute_names) > > end > > > > I tried this but got a lot of: > > ................F/Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: > warning: redefining constant Struct::CIMI_Operations > ./Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Disks > /Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Operations > F/Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Operations > ./Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Volumes > /Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_NetworkInterfaces > /Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Operations > ...../Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Structs > ../Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Meter > ...../Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: > redefining constant Struct::CIMI_Struct > > > But no errors. I think we can combine both to: > > def struct > cname = "CIMI_#{json_name.upcase_first}" > ::Struct.send(:remove_const, cname) if ::Struct.const_defined?(cname) > @struct_class ||= ::Struct.new(cname, *@schema.attribute_names) > end > > This will remove the warnings and does not define new class every time :)
Don't give the class a name at all (by passing in nil as the name) David
