2011-07-18 93 views
1

我有一個統計模型反序列化數據庫對象

class Statistic < ActiveRecord::Base 
    serialize :value 
end 

該模型包含含有目標對象一個值屬性。我想反序列化的目標對象

當我做

goals = Statistic.all 
goals.each do |goal| 
    test = goal.value  
end 

我得到一個錯誤

value was supposed to be a Goals, but was a String 

在調試器中我看到goal.value是String類型的,並且包含目標數據

--- !ruby/object:Goals \ngoals: {}\n\ngoals_against: 1\ngoals_for: 0\nversion: 1\n 

當我添加serialize :value, Goals時,我得到以下錯誤時,反序列化

ActiveRecord::SerializationTypeMismatch in ClubsController#new 

value was supposed to be a Goals, but was a String 

的目標類

class Goals 
    attr_accessor :goals 
    attr_accessor :goals_for 
    attr_accessor :goals_against 
    attr_accessor :goals_own 
    attr_accessor :penalty_for 
    attr_accessor :penalty_against 

    def initialize(goals = nil, goals_against = nil, goals_own = nil, penalty_for = nil, penalty_against = nil) 
    @version = 1 
    if goals.nil? 
     @goals = {} 
    else 
     @goals = goals  
    end  
    @goals_against = goals_against.to_i  
    @goals_own = goals_own.to_i unless goals_own.nil? 
    unless penalty_for.nil? 
     @penalty_for = penalty_for.to_i 
     @penalty_against = penalty_against.to_i 
    end 
    set_goals_for() 
    end 

    private 
    def set_goals_for  
    @goals_for = 0 
    @goals.each_value {|value| @goals_for += value.to_i } 
    @goals_for += @goals_own unless @goals_own.nil? 
    end 
end 

有人知道我怎樣才能使導軌知道它的目標對象,而不是一個字符串?

感謝

+0

你能複製粘貼你的目標課嗎?你也可以嘗試爲「值」db列設置默認值作爲空對象「--- []」 – Anatoly

+0

如何添加空對象?我正在使用sqlite進行開發 – Tarscher

+0

我現在看到你的Goals類。序列化將不起作用,直到您爲目標類別 – Anatoly

回答

2

我的大部分經驗與序列化的問題來自於軌道1時代,但我記得序列化的失敗,有兩種常用的理由:

  • 地忽略例外
  • 類重裝

看着文件./activerecord/lib/active_record/base.rb(標籤v3.0.7從git)我看到有一個'救援'條款:

def object_from_yaml(string) 
    return string unless string.is_a?(String) && string =~ /^---/ 
    YAML::load(string) rescue string 
end 

您可以嘗試調查YAML::load拋出的異常。我通常將此方法更改爲如下所示:

begin 
    YAML::load(string) 
    rescue => e 
    Rails.logger.warn "YAML exception (ignored): #{e.inspect}" 
    string 
    end 

關於類重裝,您的問題在測試模式下是否也可見?我正在YAML註冊我的類,並注意到類的定義在每個第二個請求中都消失了,因爲類對象被重新創建,並且註冊的類被從類鏈中移除。我不認爲這是你的問題,但無論如何我都會發出信號 - 這可能會有幫助嗎?

+0

我正在使用rails 3.0.7 – Tarscher

+0

在3.0.7中,object_from_yaml方法與3.0.0中的方法相同。但我看到你已經發現問題是SQLite轉義了,對嗎? – Arsen7

+0

是的,yaml被錯誤地轉換。謝謝您的幫助 – Tarscher