rails字段是JSON对象的数组?

我有一个Damage表,其中包含以下字段:

  • 描述
  • date_of_damage

我想添加另一个字段来存储Damagepoints ,这些JSON对象看起来像这样:

 { top: 50, left: 100 } 

顶部和左侧是damagepointdamagepoint的坐标。 用户使用Javascript添加/删除damagepoints点。

但是,我想在一个字段中存储这些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 (上图)等数据的最简单方法是什么? 我需要做的只是将它(通过控制器)传递给html5数据属性,以便Javascript可以使用它将现有的damagepoints添加到图表中(基于它们的坐标),然后传递更新的数组(当来自html5数据属性)当用户单击“保存”按钮时,通过AJAX调用返回控制器。

我正在使用Rails 4.2和Postresql。

谢谢!

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

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

Rails支持这个开箱即用(见这里 ),你只需要添加一个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的行。 唯一需要注意的是,虽然输入数据的符号是哈希中的键,但是从数据库中获取时,您总是会将字符串作为键返回。

在写入数据库之前序列化数据,并在读取时反序列化。 您可以覆盖模型中的getter和setter。

序列化的两个好选择是JSONYAML

Rails附带了json gem,因此您可以在任何对象或数组上调用to_json 。 然后你需要阅读它, JSON.parse(some_json)

类似地,Rails带有yaml因此您可以使用YAML.dump(text)YAML.load(text) 。 在我看来,YAML比JSON更具人性化,但如果你将数据传递给Javascript,JSON就是标准。