Запрос к полю массива Postgres JSON в Rails
Я пытаюсь запросить определенное значение в базе данных Postgres. У меня есть поле с именемgroups
вusers
Таблица, которая может быть представлена одним из следующих способов:
1.
groups: {"data"=>[{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]}
2.
groups: [{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]
Я в порядке с любым из этих представлений. Однако я просто не могу понять, как получить всех пользователей, которые находятся в серии 5, скажем так. Я пробовал несколько запросов в соответствии с:
@users = User.where("groups ->> 'data' @> ?", {serie: 5})
@users = User.where("groups -> 'data' @> '?'", {serie: 5})
@users = User.where("groups ->> 'data' ->> 'serie' = ?", 5)
И многие другие попытки, некоторые более глупые, чем другие (см. Выше). Как бы я это сделал?
Я смог определить, что:
select groups -> 'data' ->> 'serie' from users;
ERROR: cannot extract field from a non-object.
Однако работает следующий запрос:
select json_array_elements(groups -> 'data') ->> 'serie' from users;
Я думаю, что я не правильно доставляю данные в столбце. Хеш, который я предоставляю для создания:
pry(#<Overrides::RegistrationsController>)> @response['data']['user']
=> {"last_name"=>"Doe1",
"first_name"=>"John1",
"email"=>"[email protected]",
"groups"=>
{"data"=>
[{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]}}
Перед сохранением ресурс выглядит так:
pry(#<Overrides::RegistrationsController>)> @resource
=> #<User id: nil, provider: "email", uid: "", first_name: "John1", last_name: "Doe1", email: "[email protected]", role: "Student", created_at: nil, updated_at: nil, groups: {"data"=>[{"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}, {"serie"=>5, "year"=>3, "specialization"=>"Matematica", "management_id"=>1, "group_number"=>2}]}>