Поиск hstore с помощью ruby ​​on rails ничего не возвращает

У меня есть поле hstore с именем extra_info с ключом «real_params», а значением является хэш. В базе данных эта пара похожа на "real_params"=>"{\"master\":\"13\",\"reference_month\":\"58\",\"distributor\":\"14\"}".

Поиск через консоль rails с Storage.where("extra_info -> 'params' = '{\"master\":\"13\",\"reference_month\":\"58\",\"distributor\":\"14\"}'") ничего не возвращает, но изменение порядка параметров на Storage.where("extra_info -> 'params' = '{\"master\":\"13\",\"distributor\":\"14\",\"reference_month\":\"58\"}'") я нахожу его.

Почему порядок не тот? Почему это происходит?


person dieggo    schedule 15.10.2014    source источник


Ответы (1)


Тип столбца hstore предназначен для хранения пар ключ/значение, где и ключ, и значение являются строками (по крайней мере, до PostgreSQL 9.4). Значение в вашем hstore выглядит как JSON-представление Hash, но это все еще просто строка. Эти двое:

'{"master":"13","reference_month":"58","distributor":"14"}'
'{"master":"13","distributor":"14","reference_month":"58"}'

являются разными строками, даже если они эквивалентны хэшам после анализа JSON.

Вам, вероятно, будет лучше, если вы сможете переключиться на столбец JSON вместо hstore. Затем используйте оператор #>. чтобы посмотреть на пути к JSON, которые вам интересны.

Если вы должны остаться с hstore, вам нужно использовать фиксированный порядок ключей в ваших хэшах (убедитесь, например, что они всегда в алфавитном порядке) и надеяться, что JSON сохранит порядок ключей. Вам придется перестроить все ваши значения hstore, прежде чем они попадут в базу данных (вероятно, с помощью хука before_validation), и это может означать перестроение всего столбца hstore.

person mu is too short    schedule 16.10.2014
comment
Извините, ребята, я был неправ. На самом деле у меня есть 2 ключа в хеше, называемые params и real_params. В основном оба имеют одинаковые значения, но в другом порядке. Я менял их местами и понял, когда попытался отсортировать по алфавиту - person dieggo; 21.10.2014