如何在我的数据库中存储哈希?

jpw*_*ynn 9 ruby hash activerecord

是否有Ruby或Activerecord方法可以在数据库字段中写入和读取哈希值?

我需要编写一个Web实用程序来接受POST数据并将其保存到数据库中,然后再以原始哈希形式从数据库中提取它.但理想情况下,不要"了解"结构是什么.换句话说,我的数据存储需要独立于任何特定的散列键集.

例如,有一次外部应用程序可能会POST到我的应用程序:

"user" => "Bill",
"city" => "New York"
Run Code Online (Sandbox Code Playgroud)

但另一次外部应用程序可能会POST到我的应用程序:

"company" => "Foo Inc",
"telephone" => "555-5555"
Run Code Online (Sandbox Code Playgroud)

因此,我的实用程序需要将任意哈希保存到text数据库中的字段,然后,稍后从已保存的内容重新创建哈希.

Xav*_*ier 18

Rails 4增加了对Postgres hstore数据类型的支持,它允许您将哈希直接添加到您的(postgres)数据库中.

如果您使用的是Rails 4和Postgres,则可以hstore在迁移中使用:

def up
  execute "create extension hstore"
  add_column :table, :column, :hstore
end

def down
  remove_column :table, :column
end
Run Code Online (Sandbox Code Playgroud)

该执行命令将在Postgres中启用hstore,因此您只需执行一次.

这将使您能够:column像存储任何其他数据类型一样存储哈希.


Gau*_*pta 8

有两种方法可以做到这一点:

  1. 序列化哈希并将其存储在文本字段中.
  2. 拆分哈希并将每个密钥存储在单独的行中.

第一种方法的问题在于寻找和操纵是困难且昂贵的.例如,与以常规表格格式存储数据相比,在Foo Inc.工作的所有员工的电话号码之前的前缀为"0"将是一场噩梦.

您的架构将是:

employees (id, created_at, updated_at)
employee_details (id, employee_id, key, value)
Run Code Online (Sandbox Code Playgroud)

所以,要存储

"company" => "Foo Inc",
"telephone" => "555-5555"
Run Code Online (Sandbox Code Playgroud)

你会这样做:

employees: 1, 2012-01-01, 2012-01-01
employee_details (1, 1, "company", "Foo Inc"), (2, 1, "telephone", "555-5555")
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点:Rails本身不支持这种模式.


Ana*_*oly 5

您可以使用带有3个选项的序列化:Marshal采用二进制格式,YAML和JSON采用人类可读的数据存储格式.

一旦尝试了每种方法,不要忘记测量序列化和反序列化的时间.如果需要以原始格式提取数据,JSON是最好的选择,因为您不需要反序列化它,而是将其用作字符串本身.