GOOGLE ADS

понедельник, 2 мая 2022 г.

Rails Query group и pluck to Return Массив идентификаторов, сгруппированных по другому атрибуту?

Я знаю, что Model.group(:account_id).countвернет хэш account_ids => counts.

{3=>3, 4=>3, 8=>8, 10=>5, 20=>4}

Я хотел бы вернуть хэшaccount_ids => ids

{
3=>[4594, 4599, 4595],
8=>[4600, 4603, 4604, 4606, 4609, 4613, 4611, 4605],
20=>[4621, 4623, 4624, 4620],
10=>[4626, 4627, 4630, 4631, 4628],
4=>[222, 1189, 715]
}

Я мечтал, Model.group(:account_id).pluck(:id)чтобы это сработало, но выдает ошибку:

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column 
"models.id" must appear in the GROUP BY clause or be used in an
aggregate function
LINE 1: SELECT "models"."id" FROM "models...

Мое фактическое решение довольно уродливо. Кажется, должен быть более простой способ

Model.pluck(:id,:account_id).to_h
.group_by{|k,v| v}
.transform_values {|v| v.map(&:first) }


Решение проблемы

По крайней мере, в более новых версиях Rails и PostgreSQL это возможно:

pairs = Model.select(:account_id, 'array_agg(id)')
.group(:account_id)
.pluck(:account_id, 'array_agg(id)')

Это возвращает:

[
[1, [535, 536]],
[2, [542, 567, 588]],
]

который можно преобразовать в хеш:

Hash[*pairs.flatten(1)]

{
1 => [535, 536],
2 => [542, 567, 588],
}

array_aggэто функция PostgreSQL, но я предполагаю, что MySQL тоже GROUP_CONCATбудет работать.

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

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...