2012-01-11 27 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' 
相關問題