Используйте запрос GROUP_CONCAT в Rails - PullRequest
4 голосов
/ 28 апреля 2020

Мне нужны идентификаторы таблицы, но #pluck недостаточно быстро, потому что слишком много записей. Дело в том, что я хотел бы получить их в строке прямо из mysql вместо того, чтобы получить массив или ActiveRecord :: Relation

[1, 2, 3] => "1,2,3"

В Rails нет group_concat, поэтому я просто спросил через sql. Пример:

sql = User.select("GROUP_CONCAT(users.id)").to_sql
ActiveRecord::Base.connection.exec_query(sql)

Дело в том, что я не знаю почему, но он не возвращает все идентификаторы таблицы, а только некоторые из них.

Любая идея, почему не возвращает все из них или как я могу добиться этого по-другому?

Ответы [ 2 ]

5 голосов
/ 29 апреля 2020

Видимо, результат усекается до максимальной длины, заданной group_concat_max_len.

Возможно, вы могли бы увеличить это значение. Следуйте этому ответу, чтобы получить больше информации:

{ ссылка }

0 голосов
/ 29 апреля 2020

Вы можете просто назвать это так

sql = "select GROUP_CONCAT(id) from users"
data = ActiveRecord::Base.connection.exec_query(sql)
# #<ActiveRecord::Result:0x0000560661a2b7d8 @columns=["ids"], @rows=[["41,40,38,42,39,43,45,44"]], @hash_rows=nil, @column_types={}>

, тогда вы можете получить данные в виде идентификаторов с

ids = data['ids'].split(',').map(&:to_i)
# [41, 40, 38, 42, 39, 43, 45, 44]
...