Como faço para parar de rails de escapar valores em SQL para uma coluna particular?

votos
0

Estou a tentar gerir manualmente algumas colunas de geometria (espaciais) em um modelo de trilhos.

Ao atualizar a coluna de geometria I fazer isso em trilhos:

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

Que é o valor que eu quero estar nas atualizações SQL e assim ser avaliados pelo banco de dados. No entanto no momento em que este tem sido através da magia registro ativo, ele sai como:

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

Em outras palavras, as citações são escapou. Isso é bom para as outras colunas, uma vez que impede injeção SQL, mas não para este. Os valores são garantidos para ser carros alegóricos, e quero que a atualização para parecer:

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

Então, há uma maneira de transformar escapar off para uma coluna particular? Ou uma maneira melhor de fazer isso?

(Eu tentei usar GeoRuby + adaptador espacial e adaptador espacial parece muito buggy para mim, mais eu não preciso de todas as funcionalidades - daí a tentar fazê-lo diretamente).

Publicado 27/08/2009 em 03:01
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

O Spatial Adaptador Rails devem implementar exatamente o que você precisa. Embora, antes que eu encontrei GeoRuby & espacial Adapter, eu estava fazendo isso:

  • Tem dois campos: um campo de texto e um campo de geometria verdadeira, sobre o modelo
  • Em um after_savegancho, eu corri algo como isto:

    Connection.Execute "update conjunto mytable geom_column = # {text_column} onde id = # {id}"

Mas a solução acima foi apenas um truque, e isso tem problemas adicionais: Eu não pode criar um índice espacial se a coluna permite NULLvalores, MySQL não deixe-me definir um valor padrão em uma coluna de geometria, e o savemétodo falhará se o coluna de geometria não tem um valor definido.

Assim, gostaria de tentar GeoRuby & espacial adaptador em vez disso, ou reutilizar alguns dos seu código (no meu caso, eu estou considerando extrair apenas o GIS-aware MysqlAdapter#quotemétodo a partir do código espacial Adapter).

Respondeu 12/09/2009 em 22:02
fonte usuário

votos
1
  1. Você pode usar um método after_save, escrevê-los com uma chamada direta SQL UPDATE. Irritante, mas deve funcionar.

  2. Você deve ser capaz de criar um gatilho em sua migração DB usando o método 'executar' ... mas eu nunca tentei.

  3. Cavar funcionalidade calcular de ActiveRecord: max / min / avg, etc. Não tenho certeza se isso poupa-lhe muito sobre a chamada SQL direto na after_save. Veja calculations.rb.

  4. Você poderia corrigir a função que cita os atributos (procurando POINTFROMTEXT e depois pular a citar). Isso é muito fácil de encontrar, como todos os métodos começam com citações. Comece com ActiveRecord :: #quote_value Base.

Respondeu 27/08/2009 em 08:42
fonte usuário

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