在Hash中保存错误排序后的activerecord-postgres -hstore

时间:2013-02-15 05:07:26

标签: ruby-on-rails postgresql serialization rails-activerecord hstore

使用Hstore存储为Hash表,保存后在Hash中输入错误

class Service < ActiveRecord::Base
  serialize :properties, ActiveRecord::Coders::Hstore
end

service = Service.new
service.properties = { "aaa" => 1, "zz" => 2, "cc" => 3, "d" => 4 }
#=> { "aaa" => 1, "zz" => 2, "cc" => 3, "d" => 4 }
service.save
reload!
service = Service.find(:id)
service.properties
#=> { "d" => "4", "cc" => "3", "zz" => 2, "aaa" => 1 }
Bug::: wrong ordering after save

是因为序列化后它按树命令。以前有任何想法或任何人遇到过这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

来自fine PostgreSQL manual

  

<强> F.16。 hstore
  [...]
  该模块实现了hstore数据类型,用于在单个PostgreSQL值中存储键/值对的集合   [...]
  对的顺序并不重要(可能不会在输出中重现)。

因此,PostgreSQL的hstore类型是一组无序的键/值对,不保证键/值对的任何特定顺序。将Ruby Hash转换为hstore后,订单就会丢失。

如果您需要维护Hash中的订单,则必须使用其他序列化格式。