Jak mohu zastavit kolejnice unikat hodnoty v SQL pro konkrétní sloupec?

hlasů
0

Snažím se ručně řídit některé geometrie (prostorových) sloupce v modelu kolejnice.

Při aktualizaci sloupec geometrie Dělám to v kolejích:

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

Což je hodnota, chci být v SQL aktualizace, a tak být hodnoceny v databázi. Avšak v době, kdy toto bylo přes aktivního záznamu magie, to vyjde jako:

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

Jinými slovy, citace jsou unikl. To je v pořádku pro další sloupce, které zabraňuje SQL injekce, ale ne za to. Hodnoty jsou zaručeně plave, a chci, aby aktualizace vypadat následovně:

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

Takže je tam způsob, jak proměnit úniku off pro konkrétní sloupec? Nebo lepší způsob, jak to udělat?

(Snažil jsem se pomocí GeoRuby + prostorové adaptér a prostorové adaptér se jeví jako příliš buggy ke mně, a nemám potřebu všechny funkce - proto se snaží dělat to přímo).

Položena 27/08/2009 v 03:01
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Rails Spatial Adapter by měl plnit přesně to, co potřebujeme. Ačkoliv předtím, než jsem našel GeoRuby a prostorové adaptéru, jsem dělal to:

  • Mají dvě pole: jedno textové pole a pole v reálném geometrie na modelu
  • Na after_saveháku, běžel jsem něco takového:

    connection.execute "aktualizace moje_tabulka set geom_column = # {text_column} kde id = # {id}"

Ale řešení výše byla jen hack, a to má další problémy: Nemohu vytvořit prostorové indexu v případě, že sloupec umožňuje NULLhodnoty, MySQL mi nedovolí nastavit výchozí hodnotu na sloupec geometrie a savezpůsob selže, pokud geometrie sloupec nemá hodnotu nastavit.

Takže se budu snažit GeoRuby a prostorové adaptér místo, nebo znovu použít některé z jeho kódu (v mém případě, uvažuji extrahování pouze GIS vědomi MysqlAdapter#quotemetodu z kódu Spatial Adapter).

Odpovězeno 12/09/2009 v 22:02
zdroj uživatelem

hlasů
1
  1. Můžete použít after_save metodu, napište je s přímým voláním UPDATE SQL. Nepříjemné, ale měl by fungovat.

  2. Byste měli být schopni vytvořit spoušť ve své DB migraci pomocí ‚spustit‘ metodu ... ale nikdy jsem to zkusil.

  3. Kopat do funkčnosti Spočítej ActiveRecord je: max / min / avg, atd. Nejsem si jistý, zda to ušetří hodně přes přímé SQL volání v after_save. Viz calculations.rb.

  4. Dalo by se opravit funkci, kterou cituje atributy (hledá POINTFROMTEXT a pak přeskočit citovat). To je docela snadné najít, protože všechny metody začínají citovat. Začněte s ActiveRecord :: Základní #quote_value.

Odpovězeno 27/08/2009 v 08:42
zdroj uživatelem

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