Я пытаюсь преобразовать «сырой» SQL-запрос PostGIS в запрос Rails ActiveRecord. Моя цель - преобразовать два последовательных запроса ActiveRecord (каждый из которых занимает ~ 1 мс) в один запрос ActiveRecord, занимающий (~ 1 мс). Используя приведенный ниже SQL с ActiveRecord::Base.connection.execute
, я смог подтвердить сокращение времени.
Таким образом, моя прямая просьба помочь мне преобразовать этот запрос в запрос ActiveRecord (и лучший способ его выполнения).
SELECT COUNT(*)
FROM "users"
INNER JOIN (
SELECT "centroid"
FROM "zip_caches"
WHERE "zip_caches"."postalcode" = '<postalcode>'
) AS "sub" ON ST_Intersects("users"."vendor_coverage", "sub"."centroid")
WHERE "users"."active" = 1;
ПРИМЕЧАНИЕ, что значение <postalcode>
является единственной переменной данных в этом запросе. Очевидно, здесь две модели User
и ZipCache
. User
не имеет прямого отношения к ZipCache
.
Текущий двухэтапный запрос ActiveRecord выглядит следующим образом.
zip = ZipCache.select(:centroid).where(postalcode: '<postalcode>').limit(1).first
User.where{st_intersects(vendor_coverage, zip.centroid)}.count