Jak zatrzymać szyn ucieczce wartości w SQL dla konkretnej kolumny?

głosy
0

Próbuję ręcznie zarządzać kilka geometrii (przestrzennych) kolumny w modelu szyn.

Podczas aktualizowania kolumny geometrii zrobić to w szynach:

self.geom=POINTFROMTEXT('POINT(#{lat},#{lng})')

Która jest wartością chcę być w SQL aktualizacji i tak być oceniane przez bazę danych. Jednak zanim to zostało przez Active Record magii, to wychodzi jak:

INSERT IGNORE  INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT(\'POINT(52.2531519,20.9778386)\')')

Innymi słowy, cytaty uciekł. Jest to dobre rozwiązanie dla pozostałych kolumn, ponieważ zapobiega iniekcji SQL, ale nie do tego. Wartości są gwarancją pływaki i chcę aktualizację wyglądać następująco:

INSERT IGNORE  INTO `places` (..., `geom`) VALUES(...,'POINTFROMTEXT('POINT(52.2531519,20.9778386)')')

Więc czy jest jakiś sposób, aby włączyć się do ucieczki danej kolumnie? Lub lepszy sposób to zrobić?

(Próbowałem za pomocą GeoRuby + adapter przestrzennego, a adapter przestrzennego wydaje się zbyt buggy mi, plus nie muszę całą funkcjonalność - dlatego staramy się robić to bezpośrednio).

Utwórz 27/08/2009 o 03:01
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1
  1. Można użyć metody after_save, zapisz je z bezpośrednim SQL UPDATE rozmowy. Irytujące, ale powinno działać.

  2. Powinieneś być w stanie utworzyć wyzwalacz w migracji DB przy użyciu metody „Uruchom” ... ale nigdy nie próbowałem.

  3. Kopać w funkcjonalności oblicz ActiveRecord za: max / min / avg, itd. Nie wiem, czy to oszczędza dużo nad bezpośredniego połączenia SQL w after_save. Zobacz calculations.rb.

  4. Można załatać funkcję, która cytuje atrybuty (szuka POINTFROMTEXT a następnie pominąć cytowania). Jest to dość łatwe do znalezienia, jak wszystkie metody początek cytatu. Start z ActiveRecord :: Bazy #quote_value.

Odpowiedział 27/08/2009 o 08:42
źródło użytkownik

głosy
1

Szyny Przestrzennego Adapter powinien realizować dokładnie to, czego potrzebują. Chociaż, zanim znalazłem GeoRuby & przestrzenny adaptera, robiłem to:

  • Posiada dwa pola: jedno pole tekstowe i pole prawdziwy geometrii, na wzór
  • Na after_savehaku, wpadłem coś takiego:

    connection.execute "update mojatabela zestaw geom_column = # {} text_column gdzie id = # {id}"

Rozwiązanie ale powyżej to tylko hack, i to ma dodatkowe problemy: Nie mogę utworzyć indeks przestrzenny jeśli kolumna pozwala NULLwartości, MySQL nie pozwala mi ustawić wartość domyślną na kolumnie geometrii, a savemetoda nie powiedzie się, jeśli kolumna geometria nie ma ustawioną wartość.

Więc chciałbym spróbować GeoRuby & Spatial Adapter zamiast lub ponowne wykorzystanie niektórych z jego kodu (w moim przypadku, ja rozważa wyodrębnianie tylko GIS-aware MysqlAdapter#quotemetodę z kodem Adapter przestrzenna).

Odpowiedział 12/09/2009 o 22:02
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more