在数据库中存储数组:JSON与序列化数组

tit*_*oul 43 arrays json ruby-on-rails

我想存储一个包含3个元素的数组:帖子的最后3条评论.我知道我可以将评论表加入Post一个,但我会避免为扩展目的做这个繁重的请求.

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

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

Die*_*zar 77

您可以使用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']
Run Code Online (Sandbox Code Playgroud)

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

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

comment = Comment.new  # stuff: []
comment.stuff << 'some' << 'stuff' << 'as array'
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用称为商店的整洁版本:http://api.rubyonrails.org/classes/ActiveRecord/Store.html

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

  • 是的,最后一行是这样做的.它在引擎盖下自动序列化和反序列化. (5认同)
  • 为了回答我自己的问题,一个类型的 `string` 或 `text` 将适用于这个例子,尽管 `text` 应该是首选,因为你不想意外地遇到最大长度限制。 (2认同)