ruby ActiveRecord序列化编码器参数似乎不起作用

2nc8po8w  于 11个月前  发布在  Ruby
关注(0)|答案(1)|浏览(128)

我有一个Entry类,它有一个Charge属性,我想在从DB读取时从字符串示例化为Charge对象:

class Entry < ActiveRecord::Base
  serialize :charge, Charge
end

class Charge
  # Reading from the db as a string
  def self.load(str)
    str.nil? ? nil : new(str)
  end

  # Writing to the db as a string
  def self.dump(chg)
    chg.nil? ? nil : chg.to_s
  end
end

字符串
这很好用:

ent = Entry.find(1)
ent.charge.class => Charge


然而,AR正在发布一个弃用警告:
取消预订:不推荐将编码器作为位置参数传递,并将在Rails 7.2中删除。请将编码器作为关键字参数传递:
serialize:charge,coder:Byr::Charge
但是当我这样做时,AR无法将属性转换为Charge,而是将其作为String从DB返回。

class Entry < ActiveRecord::Base
  serialize :charge, coder: Charge
end
ent = Entry.find(1)
ent.charge.class => String

的字符串
是我漏了什么吗,还是其他人看到了?

uoifb46i

uoifb46i1#

为了确保序列化属性charge属于Charge类,需要在序列化器调用中指定:type参数。此外,nil时,load方法应该返回一个新的空对象。
方法签名中的更改允许您定义单独的编码器和类型类。这样,您的代码可以使用某个类加载/转储,并使属性属于不同的类。

class Entry < ActiveRecord::Base
  serialize :charge, coder: Charge, type: Charge
end

class Charge
  def self.load(str)
    str.nil? ? new(nil) : new(str)
  end
end

字符串
有关详细信息,请参阅:

  • ActiveRecord::AttributeMethods::Serialization::ClassMethods.serialize
  • rails/rails#47463

相关问题