Rails ActiveRecord嵌套查询调用to_json时未返回全部关联对象
问题原因
这个是Rails序列化接口的参数解析规则和Ruby隐式哈希语法共同导致的问题:
- Ruby解析数组时,会自动把数组末尾没有显式包裹花括号的连续键值对合并为同一个哈希,作为数组的最后一个元素。你的原始写法最终解析出来的
include参数结构实际是:
include: [ :user_public_data, :awards, { comments: {include: :user}, credits: {include: :user} } ]
- 部分版本的Rails内置JSON序列化器处理
include数组时,遇到哈希类型的元素只会读取哈希的第一个键,剩下的键会被直接忽略,所以才会出现“写在后面的关联不返回”的问题。
解决方案
把所有需要自定义嵌套配置的关联都放在同一个显式声明的哈希中,避免隐式合并的问题,两种写法都可以:
写法1:数组混合符号和单哈希
user_data['harvests'] = @harvests.to_json( include: [ :user_public_data, :awards, { comments: {include: :user}, credits: {include: :user} } ] )
写法2:直接用哈希作为include的值(更推荐,可读性更高)
如果你的关联里存在多个需要配置嵌套的项,直接把include的值设为哈希,不需要嵌套配置的关联直接设值为{}即可:
user_data['harvests'] = @harvests.to_json( include: { user_public_data: {}, awards: {}, comments: { include: :user }, credits: { include: :user } } )
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

