Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 缓存ActiveRecord模型(在3.2.1中)_Ruby On Rails_Ruby_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails 缓存ActiveRecord模型(在3.2.1中)

Ruby on rails 缓存ActiveRecord模型(在3.2.1中),ruby-on-rails,ruby,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3.2,升级到3.2.1后,我在尝试缓存activerecord模型时遇到以下错误: TypeError: can't dump hash with default proc from .../activesupport-3.2.1/lib/active_support/cache.rb:562:in `dump' 讨论了这个问题,我知道模型上的一些实例变量是一个带有默认\u proc的散列,无法封送 我尝试了一些不同的回购协议,但它不能解决类型错误问题。我也尝试实现自己的封送,但我并

升级到3.2.1后,我在尝试缓存activerecord模型时遇到以下错误:

TypeError: can't dump hash with default proc
        from .../activesupport-3.2.1/lib/active_support/cache.rb:562:in `dump'
讨论了这个问题,我知道模型上的一些实例变量是一个带有默认\u proc的散列,无法封送

我尝试了一些不同的回购协议,但它不能解决类型错误问题。我也尝试实现自己的封送,但我并不完全信任它


缓存ActiveRecord模型似乎是一件非常常见的事情。我不是唯一一个试图在3.2.1中封送ActiveRecord模型的人!还有其他人找到了合适的解决方案吗?

这可能是一个非常普遍的需求,但这并不是一个好主意。如果数据库中有某些内容,则通常希望它会更改。当模型更改时,您必须将其广播到所有缓存,以避免过时的缓存对象;所有这些都可能会带来更多麻烦和费用(尤其是当您有多个服务器盒时)与从数据库中进行简单的PK查找相比,您的时间可能会花在修复数据库中出现的任何性能问题上,从而使您希望缓存内容。使用ActiveRecord::Base#cache_键并在需要缓存的属性上使用
:touch=>true
使过时对象无效相对容易使另一个模型的缓存无效。虽然我可以在一定程度上修复性能,但我必须从多个昂贵的查询中构建某些模型集合,因此缓存最终结果(AR模型集合)是非常可取的。在这种情况下,也许您不应该直接使用AR对象。单独的接口可能更好:(1)如果X在缓存中,则返回X;(2) 否则,通过AR加载,将AR对象序列化为结构,将结构填充到缓存中,然后返回它。如果您提供更多关于使用这些昂贵查询构建的对象类型的详细信息,我们可能会帮助您更好。您是对的,使用其他可以序列化的结构并使用它是一个很好的解决方案。如果我无法缓存ActiveRecord对象,那可能就是我最终要做的事情。然而,当我完成从缓存中提取内容时,最好有一个真正的ActiveRecord实例,了解它的关联、验证和数据库连接。序列化模型的属性结构相当于编写自己的ActiveRecord模型序列化,如果存在其他解决方案,我不希望这样做。在我的特殊情况下,我正在构建一个模型集合,需要生成多个昂贵的查询。这可以优化,但仍然需要缓存最终结果(ActiveRecord模型的集合)。