在rails上搜索带有ruby的hstore,什么也没有返回

时间:2014-10-15 19:24:40

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

我有一个名为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\"}'"),我会找到它。

为什么订单不一样?为什么这很开心?

1 个答案:

答案 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列。