Podłączenie wewnętrzne ACTiVERECORD
Próbuję przekonwertować „surowe” zapytanie PostGIS SQL na kwerendę Rails ActiveRecord. Moim celem jest konwersja dwóch kolejnych żądań ActiveRecord (każde trwa ~ 1 ms)) w jedno żądanie ActiveRecord (~ 1 ms). Używając poniższego SQL z
ActiveRecord :: Base.connection.executebyłem w stanie potwierdzić redukcję czasu.
Więc moją bezpośrednią prośbą jest pomoc w konwersji tego żądania na żądanie ActiveRecord (i najlepszy sposób, aby to zrobić).
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;
NOTE
że wartość
& < postalcode & >jest jedyną zmienną danych w tym żądaniu. Istnieją oczywiście dwa modele,
Useri
ZipCache.
Usernie jest bezpośrednio powiązany z
ZipCache.
Bieżące dwuetapowe żądanie ActiveRecord wygląda następująco.
zip = ZipCache.select(:centroid).where(postalcode: '<postalcode>').limit(1).first
User.where{st_intersects(vendor_coverage, zip.centroid)}.count
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
2 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Po pierwsze, w ostatnim zapytaniu wygląda na to, że przegapiłeś część .
Oto, co bym zrobił:
Najpierw dodaj obszar dla użytkownika (do ponownego wykorzystania)
Następnie, dla rzeczywistego zapytania, możesz mieć podzapytanie bez wykonywania go i używać go w połączeniach w modelu niestandardowym, na przykład:
Pozwala to na zminimalizowanie surowego kodu SQL przy zachowaniu tylko jednego zapytania.
W każdym razie sprawdź rzeczywiste zapytanie sql w konsoli/dzienniku, ustawiając poziom rejestratora na debugowanie.
Anonimowy użytkownik
Potwierdzenie od:
scuttle.io
http://www.scuttle.io/
idealny do konwersji zapytań takich jak to: