Фильтрация Rails Postgres для объекта jsonb внутри массива jsonb

#ruby-on-rails #postgresql #activerecord #jsonb

#ruby-on-rails #postgresql #activerecord #jsonb

Вопрос:

Допустим, у меня есть модель, Neighborhood в которой есть поле jsonb[] families , которое представляет собой массив, содержащий объекты json с любым типом сопряжения ключ-значение, например [{"name":"Smiths", "count":4}, {"name":"Miller","out_on_vacation":false}, {"name":"Bennet", "house_color":"red", "count": 4}]

Я хочу выполнить запрос activerecord, чтобы найти окрестности для районов, имеющих определенные объекты внутри их families массива. Итак, если бы я сделал что-то подобное Neighborhood.where({families: {count: 4}) , результатом были бы любые модели окрестностей, поле families которых содержит объект jsonb с сочетанием ключ-значение count: 4 . Я поиграл с кучей разных запросов, но, похоже, не могу заставить ни один из них работать без возврата ошибки. Как бы мне написать запрос Activerecord, чтобы получить желаемые результаты?

РЕДАКТИРОВАТЬ: я выполнил миграцию следующим образом:

 def change 
  add_column :neighborhoods, :families, :jsonb, array: true, default: [], index: true 
end
  

Ответ №1:

Я полагаю, вы могли бы сделать что-то вроде:

 Neighborhood.where("families -> 'count' ? 4")
  

Эта статья может помочь вам:http://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails

редактировать: Только что заметил, что у вас есть массив внутри jsonb, так что это, вероятно, не сработает.

редактировать 2: на этот вопрос был дан ответ на Reddit, и он также сработал для меня. Отвечаю здесь в качестве ссылки для себя.

 Neighborhood.where %q(families @> '[{"count":?}]'), 4
  

Комментарии:

1. хммм, у меня по какой-то причине это все еще не работает, я выполнил миграцию, чтобы добавить столбец jsonb [], который я опубликовал в вопросе под заголовком редактирования. всякий раз, когда я пытаюсь, Neighborhood.where %q(families @> '[{"count":?}]'), 4 я получаю ERROR: malformed array literal и подробную информацию о том, "[" must introduce explicitly-specified array dimensions. знаете ли вы, почему это было бы случайно?

2. вы случайно не использовали индекс?