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来测试默认值。