views:

237

answers:

1

Hi,

I am completely stumped at the nature of this problem.

We export data from our application into a 'cleaned' YAML file (stripping out IDs, created_at etc). Then we (will) allow users to import these files back into the application - it is the import that is completely bugging me out.

In development, YAML::load_file(params[:uploaded_data].local_path) returns an array of YAML::Objects's (and it doesn't matter which of the number of different ways the file could be loaded):

[#<YAML::Object:0x3c63984 @class="Event", @ivars={"attributes"=>{"exception_count"=>"0", "title"=>"Start", "amount"=>"70.00", "colour"=>nil, "repeat_type_id"=>"0", "repeat_interval"=>"1"}}>, etc etc]

Which is very nice, as the attributes also include the (associated model) exceptions that you see an exception_count for.

However on production (rails 2.3.2, running REE 1.8.7 and 1.8.6 for testing, tested on two different production env's, and running production locally) it returns an array of the Objects within the YAML - in this case, Event:

[#<Event title: "Start", amount: #<BigDecimal:3af2640,'0.7E2',4(8)>, repeat_type_id: 0, colour: nil,  repeat_interval: 1, exception_count: 0>, etc etc]

Now this would be just perplexing if it also included the associated model Exception with it - however it doesn't.

Can anyone at all shed some light on why the Yaml parser would behave so differently between production and development?

I'm on rails 2.3.2, running REE 1.8.7; however I've also tested running Ruby 1.8.6 with exactly the same results.

Thanks for any help!

+1  A: 

I think this may be caused by cache_classes being set to true in production and in development false. The YAML::load_file method would try to find classes pertaining to these objects and because they haven't been loaded yet will just create them as YAML objects.

Try "loading" the Event class first simply by calling Event and see if that fixes it.

Ryan Bigg
Thanks Ryan, spot on! Calling `Event` makes development behave exactly like production, with the Event objects being returned.In order to get my required result (raw Yaml objects that I can manipulate) I changed the exported class tag from Event and was good to go.Thanks again for the help!
James