2012-01-11 25 views
8

是否有Ruby或Activerecord方法可以在数据库字段中写入和读取散列?如何在我的数据库中存储散列?

我需要编写一个网络应用程序接受POST数据并将其保存到数据库中,然后再在原来的哈希形式从数据库中拉出。但最好不知道结构是什么。换句话说,我的数据存储需要独立于任何特定的散列键集。

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

"user" => "Bill", 
"city" => "New York" 

但其他时间的外部应用程序可能会发布到我的应用程序:

"company" => "Foo Inc", 
"telephone" => "555-5555" 

所以我的实用需要保存一个任意散列到数据库中的text字段,然后,稍后从保存的内容中重新创建散列。

回答

5

您可以使用序列与3 options:二进制格式元帅,数据存储的YAML和JSON人类可读的格式。

一旦你尝试每种方法,别忘了测量时间序列化和反序列化也是如此。如果您需要将数据以原始格式返回,JSON是一个不错的选择,因为您不需要反序列化它,而是将其用作字符串本身。

8

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

  1. 系列化你的哈希值,并将其存储在一个文本字段。
  2. 拆散散列并将每个密钥存储在单独的行中。

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

你的模式将是:

employees (id, created_at, updated_at) 
employee_details (id, employee_id, key, value) 

因此,存储

"company" => "Foo Inc", 
"telephone" => "555-5555" 

你会怎么做:

这种方法的
employees: 1, 2012-01-01, 2012-01-01 
employee_details (1, 1, "company", "Foo Inc"), (2, 1, "telephone", "555-5555") 

缺点:Rails的本身并不支持此类的架构。

18

轨道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 

即执行命令将使Postgres的hstore,所以你只需要做的,一旦。

这将使您能够像存储任何其他数据类型一样在:column中存储散列。

+0

它支持nested hashes/json吗? – courtsimas 2015-06-12 21:08:44

0

Rails 4有一个名为Store的新功能,因此您可以轻松使用它来解决您的问题。您可以为其定义一个访问器,并且建议您将用于序列化商店的数据库列作为文本声明,因此有足够的空间。 original示例:

class User < ActiveRecord::Base 
    store :settings, accessors: [ :color, :homepage ], coder: JSON 
end 

u = User.new(color: 'black', homepage: '37signals.com') 
u.color       # Accessor stored attribute 
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor 

# There is no difference between strings and symbols for accessing custom attributes 
u.settings[:country] # => 'Denmark' 
u.settings['country'] # => 'Denmark' 
相关问题