我有一个名为extra_info的hstore字段,其中key为' real_params'和值是一个哈希值。在数据库中,这一对就像"real_params"=>"{\"master\":\"13\",\"reference_month\":\"58\",\"distributor\":\"14\"}"
。
使用Storage.where("extra_info -> 'params' = '{\"master\":\"13\",\"reference_month\":\"58\",\"distributor\":\"14\"}'")
查找rails控制台时,不会返回任何内容,但会将params顺序更改为Storage.where("extra_info -> 'params' = '{\"master\":\"13\",\"distributor\":\"14\",\"reference_month\":\"58\"}'")
,我会找到它。
为什么订单不一样?为什么这很开心?
答案 0 :(得分:1)
hstore列类型用于存储键和值对,其中键和值都是字符串(至少在PostgreSQL 9.4之前)。你的hstore中的值似乎是哈希的JSON表示,但它仍然只是一个字符串。这两个:
'{"master":"13","reference_month":"58","distributor":"14"}'
'{"master":"13","distributor":"14","reference_month":"58"}'
是不同的字符串,即使它们解析JSON后它们等同于Hashes。
如果您可以切换到JSON列而不是hstore,那么您可能会有更好的时间。然后使用#>
operator查看您关注的JSON路径。
如果您必须使用hstore,那么您需要在Hashes中使用固定的键顺序(例如,确保它们始终按字母顺序排列)并希望JSON保留键顺序。您必须在到达数据库之前重建所有hstore值(可能使用before_validation
挂钩)并且可能意味着重建整个hstore列。