Запрос к типу данных Json в postgres Rails-4

Я использую Rails-4, у меня есть модель продукта и сохраненные спецификации в виде типа JSON.

В файле миграции добавьте add_column :products, :specifications, :json

образец записи продукта выглядит так

#<Product id: 1, prod_id: 525141, cat_id: 6716, category_id: 5, updated: "2013-09-24 07:37:20", created_at: "2014-03-07 12:21:34", updated_at: "2014-03-07 12:32:36", eans: ["4016032274001"], skus: ["DK-1511-010F/WH"], account_id: 2, specifications: {"network"=>["PCI-Express 2.1 16x", "CardBus", "PCI-Express 3.0 16x", "PCI 64-bit, 66MHz", "PCI 64-bit, 33MHz", "PCI 32-bit, 66MHz", "PCI 3.0", "PCI 2.3", "PCI 2.2", "PCI-X", "PCI-Express 16x", "PCI-Express 8x", "PCI-Express 4x", "PCI-Express 2.0 16x", "PCI-Express 1x", "PCI", "PC Card", "ISA", "AGP 8x", "AGP 4x", "AGP 2x", "AGP 1x"], "rating"=>[4]}>

Я хочу запросить спецификацию продукта. Например: получить все продукты, рейтинг которых (внутри спецификаций) равен 4.

Есть ли какой-нибудь драгоценный камень для реализации этого?


person Shamith c    schedule 07.03.2014    source источник
comment
Используется гем Serian - Ручная реализация. Планируется перейти на эластичный поиск вместо ручного.   -  person Shamith c    schedule 17.04.2014


Ответы (2)


С появлением jsonb в Rails 4.2 с Postgres 9.4 вы можете сделать это, ЕСЛИ поле рейтинга является строкой, а не целым числом. Ниже приведен пример.

Dynamic.create(payload: {"rating"=>['4']})
Dynamic.create(payload: {"rating"=>['3']})
Dynamic.where("payload -> 'rating' ? '4'").count

Это даст вам надлежащие записи. Вам нужно будет обновить поле json до jsonb. Вы можете сделать это, следуя моему ответу здесь.

Вы можете узнать больше о том, как работать с jsonb в Rails 4.2, здесь .

person Robert    schedule 24.12.2014

Да, JSONQuery реализован в Rails через этот Gem: https://github.com/jcoglan/siren

person Severin    schedule 07.03.2014