Postgresql在保存后对hash进行排序

时间:2014-11-18 18:27:42

标签: ruby postgresql hash rails-activerecord hstore

当我保存哈希表时,我希望有一个特定的顺序(如在录制中)。但是postgres按照自己的方式排序。如何指定录音分类?

示例:

INSERT INTO "items" ("nested_params") VALUES ($1)  [["nested_params", "\"Turbo\"=>\"Some variable\",\"TV\"=>\"Some variable\",\"FM\"=>\"Some variable\"];
SELECT  "items".* FROM "items"  WHERE "items"."id" = $2 LIMIT 1 ["id", 5]];

输出(ruby hash):

{"FM"=>"Some variable", "TV"=>"Some variable", "Turbo"=>"Some variable"}

录制Turbo - 第一把钥匙。

P.S。我在哈希中使用非英语键。但它们没有按UTF-8编码的数字字母排序,而是随机排序

1 个答案:

答案 0 :(得分:0)

hstore和JSON都没有固有的排序。来自fine hstore manual

  

对的顺序并不重要(可能不会在输出中重现)。

来自fine JSON specification

  

对象是一组无序的名称/值对。

因此,不保证任何人都不关心订单,数据库可以根据需要自由重新排列。仅仅因为JSON版本似乎维护顺序并不意味着它将在下次或将在升级之后因此不依赖于此非指定行为。

如果你关心哈希的顺序,你必须自己在Ruby中做。一种简单的方法是覆盖标准的ActiveRecord访问器方法:

def nested_params
  super.sort_by(&:first).to_h
end

如果您的Ruby版本没有Array#to_h,那么您可以说:

def nested_params
  Hash[super.sort_by(&:first)]
end

您可以将hstorejson列类型与这些替代值一起使用。如果您希望排序不区分大小写,那么您必须相应地调整排序。