【问题标题】:Storing arrays in database : JSON vs. serialized array在数据库中存储数组:JSON 与序列化数组
【发布时间】:2014-01-23 15:19:39
【问题描述】:

使用 ruby​​-on-rails,我想存储一个包含 3 个元素的数组:帖子的最后 3 个 cmets。我知道我可以将 Comment 表加入到 Post 表中,但我会避免为了扩展目的而执行这个繁重的请求。

所以我想知道存储这 3 个元素的最佳方式是什么,因为我想在每次发表新评论时轻松更新它们:删除最后一条评论并添加新评论。

这样做的正确方法是什么?将其存储在序列化数组或 JSON 对象中?

【问题讨论】:

  • 如果你在 postgres 上,它有数组列类型。
  • 我正在使用 postgres:你推荐使用他们的数组列类型?
  • 显然。如果你有数组,你为什么要搞乱 JSON。
  • 我用的是Rails 3.2,好像不支持PG的那个功能
  • @titibouboul 默认情况下添加堆栈详细信息尤其是有问题的 Rails 和 ruby​​ 版本是一个好习惯。它可以节省您的大量时间,并且有经验的人可以更好更快地回答(:

标签: ruby-on-rails arrays json


【解决方案1】:

您可以使用 ActiveRecord 的 serialize 声明来存储数组和哈希:

class Comment < ActiveRecord::Base
  serialize :stuff
end

comment = Comment.new  # stuff: nil
comment.stuff = ['some', 'stuff', 'as array']
comment.save
comment.stuff # => ['some', 'stuff', 'as array']

您可以指定对象类型应等于的类名(在本例中为Array)。这更明确,也更安全一些。您也不必在分配第一个值时创建数组,因为您将能够追加到现有(空)数组。

class Comment < ActiveRecord::Base
  serialize :stuff, Array
end

comment = Comment.new  # stuff: []
comment.stuff << 'some' << 'stuff' << 'as array'

您甚至可以使用更简洁的版本,称为 store:http://api.rubyonrails.org/classes/ActiveRecord/Store.html

这应该使用内置方法处理您的用例。

【讨论】:

  • Array 序列化后,如何从数据库中提取?我认为这个答案的最后一行可能是指那个,但我不确定。如果有反序列化 Array 的内置方法,它是什么?
  • 是的,最后一行正在这样做。它在后台自动序列化和反序列化。
  • 感谢您的回复。作为一名 Rails 新手,我要求您详细说明这是如何“在引擎盖上”完成的。
  • 好的,我想我明白你的意思了。最后一行 CODE 进行反序列化。我希望你不介意,但现在我想知道我会将 Rails 项目的 Comment 类放在哪里。它是否属于控制器文件夹?
  • 要回答我自己的问题,stringtext 类型适用于此示例,但应首选 text,因为您不想意外遇到最大长度限制。
猜你喜欢
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2010-12-03
  • 2020-01-15
  • 2016-08-25
相关资源
最近更新 更多