Rails — Запрос поля JSON

В моем приложении Rails 5 я использую гем Ahoy, который использует поле jsonb (называемое properties) что я не знаю, как запросить.

Пример данных в поле properties:

"{\"id\":\"11\"}"

Я пытаюсь сделать следующее:

  1. Найдите записи, созданные за последние семь дней (используя поле time)
  2. Сгруппируйте записи по id в поле properties
  3. Упорядочить записи, исходя из того, у кого id было больше всего записей

Я пробовал это:

@foo = Ahoy::Event.where(name: "Viewed Product").where(time: 7.days.ago..Time.now).group("properties(id)").order('COUNT("properties(id)") DESC')

но я получил ошибку, PG::UndefinedColumn: ERROR: column "properties(id)" doe not exist

Я нашел этот похожий вопрос в проблемах для драгоценного камня, поэтому я попытался взломать запрос на части:

@foo = Ahoy::Event.where(name: "Viewed Product").where(time: 7.days.ago..Time.now)
@foo.group("properties REGEXP '[{,]\"id\"...).count

но тогда моя IDE выдает ошибку unterminated string meets the end of file.

Может кто-нибудь, пожалуйста, помогите мне определить, что я делаю неправильно?


person yellowreign    schedule 01.03.2017    source источник


Ответы (1)


Если вы используете PostgreSQL, я считаю, что вам придется ссылаться на столбцы json следующим образом: .group("properties ->> 'id'")

person Jawad Khawaja    schedule 01.03.2017
comment
Да, я видел сообщение об этом. Когда я попробовал это, я получил PG::GroupingError: ERROR: column "ahoy_events.id" must appear in the GROUP BY clause or be used in an aggregate function - person yellowreign; 01.03.2017
comment
Это понятно. Проверьте эту ссылку ( bernardoamc.github.io /sql/2015/05/04/ ) для получения подробной информации. Вы можете изменить свой запрос в соответствии с вашим вариантом использования. Однако в любом случае вам придется использовать properties ->> 'id', если вы планируете запрашивать столбец jsonb. - person Jawad Khawaja; 01.03.2017