我有一个 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}]
我不想使用具有
Damagepoint
关系的 has_many
表来执行此操作,因为对此的所有更改都将使用 Javascript 完成,并且如果用户创建或删除了 Damagepoints
,我只想从客户端传递更新的damagepoints
数组并用新数组替换数据库中的旧数组。如果我使用 has_many
关系,我必须删除所有的 Damagepoints
并在每次更新数组时创建一个新的(因为它太复杂了,删除/添加特定的损坏点没有任何好处,因为我不这样做)不需要跟踪历史)。存储
@damage.damagepoints
(上图)等数据的最简单方法是什么?我需要做的就是将它(通过 Controller )传递给一个 html5 数据属性,这样 Javascript 就可以使用它来将现有的 damagepoints
添加到图表中(基于它们的坐标),然后传递一个更新的数组(来自 html5 数据属性)当用户单击“保存”按钮时通过 AJAX 调用返回到 Controller 。我正在使用 Rails 4.2 和 Postresql。
谢谢!
最佳答案
当您使用 postgres 时,您很幸运:postgres 具有 native json 类型。这比使用 serialize 将数据存储为某种形式的编码字符串要好得多,因为 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。唯一需要注意的是,尽管您的输入数据将符号作为散列中的键,但在从数据库中获取时,您总是会返回字符串作为键。
关于javascript - 作为 JSON 对象数组的 rails 字段?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36103968/