Rails中MySQL JSON列初始化报错:input must be a string or IO
解决ActiveRecord JSON列初始化报错"input must be a string or IO"的问题
直接给你修复方案:把模型里的serialize :group_condition, JSON这一行删掉就能解决这个错误了。修改后的模型代码如下:
class User < ActiveRecord::Base after_initialize :set_defaults def set_defaults self.group_condition ||= [] end end
为什么会出现这个错误?
你碰到的问题核心是ActiveRecord的serialize方法和MySQL原生JSON列的内置支持冲突了:
serialize原本是用来把Ruby对象序列化(比如转成JSON字符串)存储到字符串类型的列(比如TEXT、VARCHAR)里,它要求输入必须是可转成字符串的格式。- 但MySQL 5.7的原生JSON列,Rails已经内置了自动转换逻辑——它会直接处理Ruby对象(数组、哈希)和数据库JSON格式之间的互转,完全不需要手动用
serialize来干预。
当你同时启用serialize :group_condition, JSON和原生JSON列时,在set_defaults里赋值数组[],serialize会强行用JSON模块去序列化这个数组,可原生JSON列根本不需要这个额外步骤,于是就触发了"input must be a string or IO"的错误。
验证修复效果
修改完成后,调用User.new时:
after_initialize触发set_defaults,将group_condition初始化为空数组[]- Rails会自动把这个数组转换成数据库能识别的JSON格式存储
- 从数据库读取记录时,
group_condition也会自动转回Ruby数组,完全匹配你的需求
内容的提问来源于stack exchange,提问作者Jahir
相关产品推荐
相关产品推荐

