使用自定义序列化器更改对象的句柄

时间:2019-05-17 16:10:35

标签: ruby-on-rails ruby

我已经定义了一个自定义序列化器

class CustomSerializer
  def self.dump(obj)
    obj.to_h
  end

  def self.load(obj)
    CustomClass.new(obj)
  end
end

并在活动记录模型中使用

class Klass < ActiveRecord::Base
   serialize :my_column, CustomSerializer
end 

现在,当使用Klass k = Klass.first的对象时,我总是看到k.changed? = true

我了解这是由于我定义的序列化程序引入的类引用

k.my_column_was # #<CustomClass:0x00007fd9063d6288>
k.my_column # #<CustomClass:0x00007fd9080d9088> 

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

Rails 5 Attributes API将使您能够操纵dirty tracking的处理方式。

这是用于域特定序列化的推荐方法。

  

对于更复杂的情况,例如与应用程序域对象之间的转换,请考虑使用ActiveRecord :: Attributes API。

对于Rails <5,不幸的是,文档指出:

  

序列化属性的显着副作用是,即使每次保存时模型都不会变脏,该模型也会进行更新。

您偶然发现了什么