Краткий ответ:
- Используйте
.ids
для получения только идентификаторов
- Используйте
pluck
для выборки ТОЛЬКО некоторых столбцов, но значения будут ПАРСИРОВАНЫ активной записью
- Используйте
ActiveRecord::Base.connection.select_all
, чтобы получить НЕПАРСИНДИРОВАННЫЕ значения.
Примечания:
Существует небольшая разница между pluck
и select_all
:
Если вы pluck
данные - ActiveRecord сопоставляет данные с объектами Ruby, такими как Dates, Enums,
Модели и т. Д., И это может отличаться от ожидаемого.
Вы можете заметить, что приведенный ниже результат представляет собой строку:
2.5.1 :001 > ActiveRecord::Base.connection.select_all("select created_at from some_ar_class where id = 1 limit 1").rows.first
(0.6ms) select created_at from some_ar_classes where id = 1 limit 1
=> ["2018-10-01 01:12:31.758161"]
Пока pluck
Даты возврата
2.5.1 :002 > SomeARClass.where(id: 1).pluck(:created_at).first.class
(0.4ms) SELECT "some_ar_classes"."created_at" FROM "some_ar_classes" WHERE "some_ar_classes"."id" = $1 [["id", 1]]
=> ActiveSupport::TimeWithZone
То же самое происходит с Enums (int в базе данных, но: символы в Ruby)
И все эти операции разбора / отображения также требуют времени. Это не много, но все же. Поэтому, если вы запрашиваете самый быстрый способ извлечения данных - это, безусловно, необработанный SQL-запрос с connection.select_all
, но существуют очень маленькие ситуации, когда вы можете добиться значительного увеличения производительности при этом.
Поэтому я рекомендую использовать pluck
.