#ruby-on-rails #postgresql #analytics #cube.js
#ruby-на-рельсах #postgresql #аналитика #cube.js
Вопрос:
Я совсем новичок в Cube.js . Я пытался интегрировать Cube.js функциональность аналитики в моем приложении Ruby on Rails. База данных — PostgreSQL. В базе данных есть определенный столбец с именем answers_json с типом данных jsonb, который содержит вложенный хэш. Примером данных этого столбца является:
**answers_json:**
"question_weights_calc"=>
{"314"=>{"329"=>1.5, "331"=>4.5, "332"=>1.5, "333"=>3.0},
"315"=>{"334"=>1.5, "335"=>4.5, "336"=>1.5, "337"=>3.0},
"316"=>{"338"=>1.5, "339"=>3.0}}
В том же столбце есть еще много ключей с той же хэш-структурой, что и показано выше. Я опубликовал конкретную часть, потому что я буду иметь дело только с этой частью. Мне нужна помощь с доступом к значениям в хэше. Столбец имеет вложенный хэш. В приведенном выше примере ключи «314», «315» и «316» являются идентификаторами категорий. Ключи, связанные с идентификатором категории «314», являются «329»,»331″,»332″, «333»; которые являются идентификаторами вопросов. В каждой категории будет несколько вопросов. Для разных записей идентификаторы категорий и вопросов будут динамическими. Например, для другой записи идентификатор категории и идентификаторы вопросов, связанные с этим идентификатором категории, будут другими. Мне нужно получить доступ к значениям, связанным с идентификатором ключевого вопроса. Например, чтобы получить доступ к значению «1.5», мне нужно сделать это в моем файле схемы:
**sql: `(answers_json -> 'question_weights_calc' -> '314' ->> '329')`**
Но проблема здесь в том, что эти идентификаторы будут динамическими для разных записей в базе данных. Вместо «314» и «329» они могут быть некоторыми другими числами. Добавление json другой записи здесь для пояснения:
**answers_json:**
"question_weights_calc"=>{"129"=>{"273"=>6.0, "275"=>15.0, "277"=>8.0}, "252"=>{"279"=>3.0, "281"=>8.0, "283"=>3.0}}}
Как я могу узнать и получить доступ к этим динамическим идентификаторам и их значениям, поскольку мне также нужно выполнять математические операции со значениями. Спасибо!
Комментарии:
1. Как вы определяете идентификаторы, к которым вам нужно получить доступ в каждой структуре? Будете ли вы получать их внешне? Или это что-то вычисленное на основе списка существующих идентификаторов в структуре?
2. @MichalT Когда пользователь заполняет опрос, создается запись этого типа в формате JSON. т.Е. Категории и вопросы уже созданы в системной базе данных. Когда пользователь отвечает на конкретный вопрос, относящийся к определенной категории, мы просто связываем эти идентификаторы и ответ пользователя в форме JSON.
Ответ №1:
Как правило, сложно запускать отчеты на основе SQL для высокодинамичных данных JSON. У Postgres есть некоторые полезные функции для работы с JSON, и вы могли бы использовать json_each
или json_object_keys
плюс несколько объединений, чтобы добраться туда, но вполне вероятно, что производительность и удобство обслуживания такого запроса будут, мягко говоря, сложными 😅 Cube.js в конечном счете выполняет SQL-запросы, поэтому, если вы перейдете квыше маршрута запрос должен быть легко перенесен на Cube.js схема.
Другим подходом было бы создание отдельного конвейера обработки данных, который собирает все данные JSON и сводит их в единую таблицу. Затем конвейер должен сохранить эти данные обратно в выбранной вами базе данных, откуда вы могли бы затем использовать Cube.js чтобы запросить его.