如何在Rails中使用嵌套数组的PostreSQL hstore?

时间:2015-09-30 23:52:52

标签: ruby-on-rails arrays postgresql hash hstore

迁移:

class Preference < ActiveRecord::Migration

  def change
    enable_extension 'hstore'

    create_table :preferences do |t|
      t.hstore :prefs
    end
  end
end

型号:

class Preference < ActiveRecord::Base
  store_accessor :prefs
end

如果prefs是{ email:'yes' }之类的哈希,这似乎有效,但不适用于内部有数组的哈希:{ email:[ 'monday', 'tuesday' ]}

拉出散列时,数组保存为JSON。

是否有一种使用嵌套哈希和数组的hstore的好方法?

我确实尝试将array:true添加到迁移中,但这似乎只允许保存数组而不是哈希。

如何使用嵌套哈希和数组的Rails PostgreSQL hstore?

Rails 4.2.4,PostgreSQL 9.3.5

2 个答案:

答案 0 :(得分:9)

PostgreSQL hstore旨在存储文本字符串的键值对。看看hstore docs

我使用JSON类型将数组存储为哈希中的值。有两种JSON数据类型:JSON和JSONB。 JSONB支持索引但速度稍慢,而JSON不支持索引但速度更快。你可以在这里阅读它们:JSON Type

我会做以下事情:

class Preference < ActiveRecord::Migration
  def change
    create_table :preferences do |t|
      t.json :prefs
    end
  end
end

在hstore列上的旁注设置array: true意味着您要存储一组hstore。

答案 1 :(得分:1)

您只需在访问时解析JSON:

class Preference < ActiveRecord::Base
  def prefs
    self[:pref] = json_parse_values self[:pref]
  end

  private
  def json_parse_values(hash)
    hash.map do |key, val|
      begin
        [key, (val.is_a?(String) ? JSON.parse(val) : val)]
      rescue JSON::ParserError => e  
        [key, val]
      end 
    end.to_h
  end
end

解析方法仅在其字符串时才尝试解析值。如果它引发ParserError,我们只使用字符串。