我有一个包含以下字段的 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。唯一需要注意的是,尽管您的输入数据将符号作为散列中的键,但从数据库中获取时,您总是会得到字符串作为键。