2013-10-14 87 views
3

當我使用identity_cache(v 0.0.4)和delayed_job(v 3.0.3)時,出現錯誤「undefined method`tag ='for#< Hash:0x007f9836dfdab0 >相同的應用程序。未定義的哈希方法標記使用identity_cache和delayed_job

我跟着堆棧跟蹤和發現的delayed_job覆蓋的ActiveRecord :: Base的#encode_with。在delayed_job的版本,它會調用

coder.tag = ['!ruby/ActiveRecord', self.class.name].join(':') 

看來的ActiveRecord :: Base的預期編碼器是一個哈希,而delayed_job假設它是一個Psych :: Coder,它有一個tag =方法。

最後,identity_cache確實調用了encode_with,並傳遞了一個Hash。因此錯誤。

我正在使用紅寶石1.9.3p429,其中包括精神作爲stdlib。我沒有在任何地方指定yaml解析器引擎,並且當我檢查時它總是返回psych(有些人抱怨類似的問題,但他們使用syck進行yaml解析)。

所以,我想問題是,我該如何讓delayed_job和identity_cache一起玩呢?

回答

0

也許不是最優雅的解決方案,但下面的猴子補丁是一個工作。到目前爲止,我沒有觀察到任何錯誤。我放棄了它... /配置/初始化/ patch_identity_cache.rb:自從他的回答IdentityCache代碼改變

module IdentityCache 
    module ConfigurationDSL 
    extend ActiveSupport::Concern 

    module ClassMethods 
     alias_method :original_build_normalized_has_many_cache, :build_normalized_has_many_cache 
     def build_normalized_has_many_cache(association, options) 
     original_build_normalized_has_many_cache(association, options) 

     self.class_eval(ruby = <<-CODE, __FILE__, __LINE__) 

      def #{options[:population_method_name]} 
      @#{options[:ids_variable_name]} = #{options[:ids_name]} 
      association_cache.delete(:#{association}) 
      @#{options[:records_variable_name]} = nil 
      end 

     CODE 
     end 
    end 
    end 
end 
0

pduey的回答並沒有爲我工作。

this issue作品下修爲identity_cache 0.2.3:

# config/initializers/patch_identity_cache.rb: 
ActiveRecord::Base.class_eval do 
    def encode_with_override_override(coder) 
    encode_with_without_override(coder) 
    coder.tag = "!ruby/ActiveRecord:#{self.class.name}" unless coder.is_a? ::Hash 
    end 
    alias_method :encode_with, :encode_with_override_override 
end 
相關問題