Sid*_*Sid 7 memcached ruby-on-rails models eager-loading
我在我的Rails应用程序中使用Memcached作为Object Store,我在其中存储了memcached中User对象的搜索结果
现在,当我获取数据时,我得到了Memcached Undefined Class/Module Error.我在这个博客中找到了解决这个问题的方法
http://www.philsergi.com/2007/06/rails-memcached-undefinded-classmodule.html
before_filter :preload_models
def preload_models
Model1
Model2
end
Run Code Online (Sandbox Code Playgroud)
建议事先预装模型.我想知道是否有一个更优雅的解决方案来解决这个问题,并且使用预加载技术有任何缺点.
提前致谢
我也有这个问题,我想我想出了一个很好的解决方案.
您可以覆盖fetch方法并挽救错误并加载正确的常量.
module ActiveSupport
module Cache
class MemCacheStore
# Fetching the entry from memcached
# For some reason sometimes the classes are undefined
# First rescue: trying to constantize the class and try again.
# Second rescue, reload all the models
# Else raise the exception
def fetch(key, options = {})
retries = 2
begin
super
rescue ArgumentError, NameError => exc
if retries == 2
if exc.message.match /undefined class\/module (.+)$/
$1.constantize
end
retries -= 1
retry
elsif retries == 1
retries -= 1
preload_models
retry
else
raise exc
end
end
end
private
# There are errors sometimes like: undefined class module ClassName.
# With this method we re-load every model
def preload_models
#we need to reference the classes here so if coming from cache Marshal.load will find them
ActiveRecord::Base.connection.tables.each do |model|
begin
"#{model.classify}".constantize
rescue Exception
end
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
小智 5
今天就这样,设法提出了一个应该适用于所有课程的更简洁的解决方案.
Rails.cache.instance_eval do
def fetch(key, options = {}, rescue_and_require=true)
super(key, options)
rescue ArgumentError => ex
if rescue_and_require && /^undefined class\/module (.+?)$/ =~ ex.message
self.class.const_missing($1)
fetch(key, options, false)
else
raise ex
end
end
end
Run Code Online (Sandbox Code Playgroud)
不知道为什么[MemCacheStore]没有[MemCacheStore.const_missing]调用方法,一切都以正常的"Rails-y"方式调用.但是,这应该效仿!
干杯,
克里斯
| 归档时间: |
|
| 查看次数: |
2345 次 |
| 最近记录: |