Запрос массива jsonb для частичного значения - PullRequest
0 голосов
/ 09 января 2019

В приложении Rails 5.2 модель User имеет атрибут subscriptions jsonb

t.jsonb "subscriptions", default: [], null: false

Примером является

irb(main):091:0> User.first.subscriptions
=> [{"id"=>"dfdaad60", "type"=>"Organization"}, 
    {"id"=>"18616f4d", "type"=>"Project"}]

Как я могу, используя арель, получить id с всех subscriptions, имеющих type, равных Project?

Я безуспешно пытался использовать оператор @>.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Это поможет, используя пользовательский оператор SQL:

sql = "SELECT value->'id' AS id FROM users, jsonb_array_elements(users.subscriptions) WHERE data @> '#{[{type: "Project"}].to_json}'"
result = ActiveRecord::Base.connection.execute(sql)
puts result.to_a
0 голосов
/ 09 января 2019

Далее будет возвращен массив ids для подписок (имеющих тип «Проект») пользователей,

User.pluck(:subscriptions).flatten.map { |x| x['id'] if x['type'] == 'Project' }.compact

Вам не требуется where AR или AREL-запрос, поскольку вам нужно только ids присутствовать внутри подписок для типа, имеющего «Project», и его можно получить, как указано выше.

...