javascript - 作为 JSON 对象数组的 Rails 字段?

标签 javascript ruby-on-rails ruby json postgresql

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

关于javascript - 作为 JSON 对象数组的 Rails 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103968/

相关文章:

javascript - 是否可以在谷歌云功能中放置一个计时器?

javascript - sum(2)(3) 和 sum(2, 3) 两者的共同解决方案是什么

ruby - 从本地源代码运行 gem

ruby-on-rails - 如何从 Rails 控制台渲染部分内容?

ruby-on-rails - 我如何处理在 Rails 应用程序中共享唯一 URL?

ruby-on-rails - UsersController 中的 NameError -(未初始化的常量 SCrypt)

javascript - 如何使用 Node require 在另一个 Javascript 文件中定义类的函数?

javascript - 在 if/else 语句中处理多个 'elseif' 的更好方法是什么

ruby-on-rails - Rails 查询 has_many 关联记录之间的差异

ruby-on-rails - 使用正则表达式获取链接