【问题标题】:Deserialized Rails ActiveRecord object won't save to SQL database反序列化的 Rails ActiveRecord 对象不会保存到 SQL 数据库
【发布时间】:2018-06-27 00:05:49
【问题描述】:

问题:对对象进行序列化和反序列化后,完全有效的 ActiveRecord 模型对象将无法保存到 SQL 数据库。

对象被序列化:

File.open(output_file, 'wb+') { |f| f.write(YAML.dump(objects_to_marshal)) }

然后反序列化

stuff = YAML.load(File.read(output_file))

即使我将它的主键 ID 和 created_at 和 updated_at 字段显式设置为 nil,该对象也不会保存。

[64] pry(main)> fpt = stuff[10][0]
=> #<FakeProductTest:0x0055ee2244a938
 id: 1,
 name: "test",
 description: nil,
 created_at: Fri, 29 Dec 2017 21:24:07 UTC +00:00,
 updated_at: Thu, 18 Jan 2018 01:09:37 UTC +00:00>
[65] pry(main)> fpt.class.name
=> "FakeProductTest"
[66] pry(main)> FakeProductTest.count
=> 0
[67] pry(main)> fpt.save
=> true
[68] pry(main)> FakeProductTest.count
=> 0
[69] pry(main)>

我已经通过 MySQL 命令行验证我可以读/写数据库,所以这不是权限问题。

【问题讨论】:

  • 保存后试试FakeProductTest.reload,看看计数是否变化
  • [70] pry(main)> fpt.reload ActiveRecord::RecordNotFound: 找不到 'id'=1 的 FakeProductTest
  • 做这样的事情对我有用。当我看到奇怪的行为时,我经常做的事情是spring stop,值得一试。
  • 我什至没有安装弹簧
  • 这段代码是来自测试还是什么?

标签: ruby-on-rails ruby activerecord serialization deserialization


【解决方案1】:

已解决:调用 var_name.dup.save 有效。

可能有用的中间调试步骤:

[6] pry(main)> fpt.valid?
=> true
[7] pry(main)> fpt.changed?
=> false
[8] pry(main)> fpt.save!
=> true
[9] pry(main)> FakeProductTest.count
=> 0
[11] pry(main)> fpt.errors.messages
=> {}

感谢@thorncp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2010-11-19
    • 2015-02-14
    • 2013-09-16
    • 2011-02-26
    • 2014-12-13
    相关资源
    最近更新 更多