ActiveRecord序列化将nil发送到当前属性的自定义序列化程序

我有以下自定义序列化程序:

class ReportCardDataSerializer def self.dump(hash) hash.to_json end def self.load(json) # json.class == NilClass, why???? hash = (json || {}).with_indifferent_access end end 

以下类具有序列化data属性,数据库列设置为NOT NULL。

 class ReportCardGroup < ActiveRecord::Base serialize :data, ReportCardDataSerializer # data is PostgreSQL jsonb column end 

ReportCardDataSerializer dump方法按预期工作。 但是在尝试load ReportCardDataSerializer时,即使数据库列不是nil, load方法也会被发送为nil。

为什么会这样?

我通过浏览ActiveRecord序列化类来解决这个问题。

ActiveRecord序列化程序调用type_cast_from_database

 def type_cast_from_database(value) if default_value?(value) value else coder.load(super) end end def default_value?(value) value == coder.load(nil) # HERE: Calls Serializer with nil end 

我假设ReportCardDataSerializer永远不必处理nil,但ActiveRecord实际上首先尝试加载nil来测试默认值。