我有一个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)
=>#&书信电报;项目关键字: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中应该可以