“Rails.cache.fetch”和“Rails.cache.write”中的“无法转储文件”

时间:2011-06-23 18:18:33

标签: ruby-on-rails ruby ruby-on-rails-3 caching activerecord

自从我开始为我的应用程序(文件缓存,内存缓存或任何其他)开始使用缓存以来,我一直在将应用程序移植到“Rails 3.0.7”上。我总是遇到上面的错误“无法转储文件”。

我谷了一点,发现它与Marshal转储有关,因为ruby解释器允许Marshal转储具有Procs或lambdas的对象,所以我查看了我的代码,但是我找不到任何Proc和lambda我的整个申请

现在发现问题我深入研究了ActiveRecord 3.0.7代码,这里有一些有趣的发现我想出了

1。“包含”在Rails 3 +内部调用define 名称范围确定这个我给出的答案是Proc和Lambada与该对象关联所以错误这并不能解释为什么相同的代码有时会工作并报告错误(错误上方)其他时候我的意思是如果错误是针对编组和持有的对象一个Proc或Lambada然后代码肯定不会工作,并且应该始终报告错误,无论运行相同代码多少次但不是这里的情况代码返回错误有时和工作正常

代码

  

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

2。如果Rails 3.0 +中的“。include”出现问题,那么其他'包含'语法也会出现问题报告错误(上述错误) 所以我使用包含

旧语法运行代码

这是

  

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

令人惊讶的是它已经运行但从未为所有网站(这是奇怪的地方)预装了相关帐户,但至少它从未给过和错误 因此,Active Record 3.0 +的取证再次发现旧版本的包含(Rails 2.3 +)如何让人知道旧版包含语法< strong>内部调用 ActiveRecord 3.0 +的 .includes方法

whoo这怎么可能  两个不同的语法都调用相同的内部方法一个报告,错误有时(不是每次都预先加载关联对象)而其他报告错误但两者都没有如前所述,预加载相关对象

好的,听到这一切,如果有人能帮助我,那么我会非常感激

顺便说一下

这是我想要实现的目标

  

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

Rails 2.3.5和Rails 3 +中的上述等效代码(但不预加载所有网站的关联帐户对象) 即

  

Rails.cache.fetch( “accessible_websites_1”)   {Website.find(:all,:include =&gt;   :account)}

完美无缺地完成工作

我用

  

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

同样的问题甚至在 Rails 3.1.0

上持续存在 我错过了什么

如果需要,我也可以提供模型结构

1 个答案:

答案 0 :(得分:1)

问题在于

Website.includes(:account)

不加载数据,它只是为您提供一个代理对象,当您执行调用#each#to_s之类的操作时,如果您通过添加#to_a最后它应该起作用,例如尝试

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

#all(x=>y)#x(y)的做法不同,这就是X.includes.joins.where而不是X.all.where的原因。

不确定File的引用来自哪里。