我有一个 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}]
    

    我不想使用具有 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/

    10-09 04:06