You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时:

  1. after_initialize触发set_defaults,将group_condition初始化为空数组[]
  2. Rails会自动把这个数组转换成数据库能识别的JSON格式存储
  3. 从数据库读取记录时,group_condition也会自动转回Ruby数组,完全匹配你的需求

内容的提问来源于stack exchange,提问作者Jahir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:48