Viren
Viren

Reputation: 5962

"can't dump File" during "Rails.cache.fetch" and "Rails.cache.write"

I been working on porting my application on "Rails 3.0.7" ,ever since I started to employ caching for my application either (file cache,memcache or any other) . I always happen to get the above error "can't dump File" .

I Google a bit and found that it has something to do with Marshal dump as ruby interpreter does allow Marshal dump of object that have Procs or lambdas in them so I looked upon my code but I could not find any Proc and lambda in my whole applications

Now to discover the problem I drill down the ActiveRecord 3.0.7 code and here are few interesting finding that I came up with

1 . "includes" in Rails 3 + internally call the define name scope OK this I give the answer that there is Proc and Lambada associated with the object so the error but this doesn't explain why the same code work sometime and report with errors(above errors) other times I mean If the error is for the Marshalling and object that hold a Proc or a Lambada then code should definitely not work and should always report errors no matter how many times the same code is ran but that not the case over here the code return errors sometimes and work well other times

Code

Rails.cache.fetch("accessible_websites_1") { Website.includes(:account) }

2 . If the ".includes" in Rails 3.0 + has problem then what up with other 'include' syntax does it too report error (above error) so I ran the code with older syntax of include

Here is it

Rails.cache.fetch("accessible_websites_1") { Website.all(:include => :account) }

well surprisingly it ran but it never preloaded the account related for all the website ( which is where weird) but at least It never gave and error so did a forensic on Active Record 3.0 + once again to discover how the older version of include(Rails 2.3 +) work surprise to know that the older version of include syntax internally call the .includes method of ActiveRecord 3.0 +

whoo How is that possible two different syntax both call the same internal method one report with error sometimes ( not every time but preload the associated object) and other does not report with error but neither preload the associated object as said earlier.

OK , Hearing all this if anyone can help me out then I would be utmost grateful

By the way

Here what I'm trying to achieve

Rails.cache.fetch("accessible_websites_1") { Website.includes(:account) }

the equivalent code of above in Rails 2.3.5 and Rails 3 + (but does not preload the associated account object of all websites) i.e

Rails.cache.fetch("accessible_websites_1") { Website.find(:all,:include => :account) }

Work perfectly fine without any issue

I using

Ruby = "ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]" Rails = " Rails 3.0.7"

The same Problem even persisted on Rails 3.1.0

am I missing something

I can also provide the model structure if required

Upvotes: 1

Views: 1659

Answers (1)

riffraff
riffraff

Reputation: 2447

The problem is that

Website.includes(:account)

does not load the data, it just provides you with a proxy object that will load the objects on demand when you do something like calling #each or #to_s, if you force the fetching by adding a #to_aat the end it should work, e.g. try

Marshal.dump(Website.includes(:account))
Marshal.dump(Website.includes(:account).to_a)

#all(x=>y) does not do the same thing as #x(y), that is why you can do X.includes.joins.where but not X.all.where.

Not sure where the reference to a File comes from though.

Upvotes: 1

Related Questions