RubyonRails jsonb列默认值

我有一个model ProjectKeyword,其中我在列中使用了jsonb数据类型:segemnted\u data

类项目关键字<应用记录
属于:项目
属于:关键字
有很多:项目关键字维度
有多个:维度,通过::project\u关键字\u维度
验证:项目id,:关键字id,状态:true
终止

迁移

类addSegemtneddataTopProjectKeywords<ActiveRecord::迁移[5.0]
def更换
添加列:项目关键字,:分段数据,:jsonb,默认值:“{}”
添加索引:项目关键字:分段数据,使用::gin
终止
终止

我的问题是,当我创建新的project\u关键字实例时,segmented\u数据的默认值是字符串而不是散列,我无法更新此字段或与其他散列合并
比如说

[12]撬动(#)>新建关键字=项目关键字。新建(项目id:1671333,关键字id:39155)
=&gt#&书信电报;项目关键字:0x007fd997641090 id:nil,项目id:1671333,关键字id:39155,分段数据:“{}”>
[13] 撬动(#)>新建\u pr\u关键字。保存!
=>符合事实的
[14] 撬动(#)>新建\u pr\u关键字。分段的\u数据。更新({'new\u data'=>'some\u data'})
NoMethodError:“{}”的未定义方法“update”:字符串
from(撬动):14:in'block(3层)in<顶部(必需)>'

但是,当我在更新之前向字段分段数据添加hash值时,update方法工作正常

比如说

[15]撬动(#)>新建\u pr\u关键字。分段的\u数据={'new\u data'=>'some\u data'}
=>{“新数据”=>“某些数据”}
[16] 撬动(#)>新建\u pr\u关键字。保存!
=>符合事实的
[17] 撬动(#)>new_pr_关键字。分段的_数据。更新({'new_data_2'=>'some_data_2'})
=>{“新数据”=>“一些数据”,“新数据”=>“一些数据”}
[18] 撬动(#)>新建\u pr\u关键字。保存!
=>符合事实的

问题是如何使分段_数据的默认值成为散列类而不是字符串,以便在刚刚创建对象之后,方法更新将直接在该字段上工作

这在我的几个项目中起到了作用:

添加列:项目关键字,:分段数据,:jsonb,默认值:{}

(不是字符串,而是ruby哈希)

我似乎记得这在Rails3上不起作用,但在Rails4中应该可以

发表评论