#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. вы случайно не использовали индекс?