我有一个包含以下字段的 Damage 表:

  • 描述
  • date_of_damage

我想添加另一个字段来存储 Damagepoints,它们是如下所示的 JSON 对象:

{ top: 50, left: 100 } 

顶部和左侧是图表上damagepoint 的坐标。 damagepoints 由用户使用 Javascript 添加/删除。

但是,我想在一个字段中存储这些 damagepoints 的数组,如下所示:

@damage.damagepoints = [{left: 40, top: 99}, {left: 100, top: 35}, {left: 150, top: 95}] 

我不想使用具有 has_many 关系的 Damagepoint 表来执行此操作,因为对此的所有更改都将使用 Javascript 完成,如果 Damagepoints 由用户创建或删除,我只想从客户端传递更新后的 damagepoints 数组,并用新数组替换数据库中的旧数组。如果我使用 has_many 关系,我必须删除所有的 Damagepoints 并在每次更新数组时创建每个新的(因为它太复杂而且有删除/添加特定损坏点没有任何好处,因为我不需要跟踪历史记录)。

存储@damage.damagepoints(上图)等数据的最简单方法是什么?我需要做的就是将它(通过 Controller )传递给 html5 数据属性,以便 Javascript 可以使用它来将现有的 damagepoints 添加到图表中(基于它们的坐标),然后在用户单击“保存”按钮时通过 AJAX 调用将更新后的数组(来自 html5 数据属性)传回 Controller 。

我正在使用 Rails 4.2 和 Postresql。

谢谢!

请您参考如下方法:

当你使用 postgres 时,你很幸运:postgres 有一个原生的 json类型。这比使用序列化将数据存储为某种形式的编码字符串要好得多,因为 postgres 具有丰富的运算符系列,可让您查询该 json 数据。

如果您使用的是 postgres 9.4,那么您也可以使用 jsonb 类型。这通常更好,因为它存储数据的处理版本(即它不必一遍又一遍地重新解析数据)并且它允许索引。

Rails 开箱即用地支持这一点(参见 here ),您只需要添加一个类型为 json(b) 的列。如果您的迁移包含

create_table :damages do |t| 
  t.string :description 
  t.jsonb :damage_points 
end 

然后

Damage.create(damage_points:  [{left: 40, top: 99}, {left: 100, top: 35}]) 

将创建一行,将损坏点数据存储为 json。唯一需要注意的是,尽管您的输入数据将符号作为散列中的键,但从数据库中获取时,您总是会得到字符串作为键。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!