2010-08-20 19 views
7

Tôi đang sử dụng Memcached là một cửa hàng đối tượng với ứng dụng Rails của tôi, nơi tôi lưu trữ kết quả tìm kiếm mà là những đối tượng người dùng trong memcachedmemcached như một cửa hàng đối tượng trong Rails

Bây giờ khi tôi lấy dữ liệu ra tôi nhận được Memcached Không xác định lớp/Lỗi mô-đun. Tôi tìm thấy một giải pháp cho vấn đề này trong blog này

http://www.philsergi.com/2007/06/rails-memcached-undefinded-classmodule.html

before_filter :preload_models 
    def preload_models 
    Model1 
    Model2 
    end 

mà khuyến cáo trước khi tải các mô hình trước mặt. Tôi muốn biết nếu có một giải pháp thanh lịch hơn cho vấn đề này và có bất kỳ hạn chế trong việc sử dụng các kỹ thuật tải trước.

Cảm ơn trước

Trả lời

8

Tôi cũng gặp vấn đề này và tôi nghĩ tôi đã đưa ra một giải pháp tốt đẹp.

Bạn có thể ghi đè phương pháp tìm nạp và giải cứu lỗi và tải các hằng số bên phải.

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 
+0

Giải pháp này là rất tốt, nhưng nó giới hạn đối với mô hình kỷ lục hoạt động. Đôi khi bạn sẽ lưu vào bộ nhớ đệm các lớp không phải AR, trong trường hợp này tôi nghĩ bạn sẽ phải sử dụng giải pháp thứ nhất trong chuỗi này. –

+0

Điều này làm việc tuyệt vời cho tôi, cảm ơn! –

+0

@KonstantinGredeskoul Chỉ cần bỏ qua phần preload_models –

5

Chạy qua ngày hôm nay, quản lý để tìm ra giải pháp ngắn gọn hơn sẽ hiệu quả cho tất cả các lớp.

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 

Không chắc chắn tại sao [MemCacheStore] không gặp là [MemCacheStore.const_missing] phương pháp gọi và tất cả mọi thứ nhận được gọi là trong bình thường “Rails-y” cách. Nhưng, điều này sẽ mô phỏng điều đó!

Chúc mừng,

Chris

+0

làm việc cho tôi. giải pháp tốt đẹp – ifightcrime

Các vấn đề liên quan