2012-10-29 46 views
2

我在使用delayed_job(3.0.3)和ruby 1.9.3時遇到了問題。之前我們使用的ruby 1.8.7與yaml syck解析器一起提供,它讀取爲ruby對象(包括attr_accessors)設置的所有屬性,但升級到1.9.3時,yaml解析器切換到了psych(這是重新編譯的)寫入),並且不考慮除數據庫中保留的任何屬性。我們怎樣才能讓心理考慮到attr_accessors。我試圖切換到syck通過:YAML,delayed_job:Psych vs Syck。如何讓pysch讀取attr_accessors的紅寶石對象

YAML::ENGINE.yamler = 'syck' 

但仍然無法正常工作。

有沒有人有解決這個問題?

回答

1

上述hack不起作用,但我們需要的是重寫ActiveRecord :: Base的encode_with和init_with方法以包含屬性訪問器。更確切地說,我們需要使用att_accessors來設置編碼器散列,並負責實例變量持久性。

有趣的閱讀:https://gist.github.com/3011499

1

的delayed_job的解串器不調用init_with加載ActiveRecord的對象。

這裏是delayed_job的猴子補丁,不會調用init_with生成的對象:https://gist.github.com/4158475

例如與猴子補丁,如果我有一個叫做藝術品與額外的模型屬性路徑和深度:

class Artwork < ActiveRecord::Base 
    def encode_with(coder) 
    super 

    coder['attributes']['path'] = self['path'] 
    coder['attributes']['depth'] = self['depth'] 
    end 

    def init_with(coder) 
    super 

    if coder['attributes'].has_key? 'path' 
     self['path'] = coder['attributes']['path'] 
    end 

    if coder['attributes'].has_key? 'depth' 
     self['depth'] = coder['attributes']['depth'] 
    end 

    self 
    end 
end