Comment puis-je arrêter des rails de valeurs dans SQL échapper pour une colonne particulière?

voix
0

Je suis en train de gérer manuellement une géométrie des colonnes (spatiales) dans un modèle de rails.

Lors de la mise à jour de la colonne de géométrie, je le fais dans des rails:

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

Quelle est la valeur que je veux être dans les mises à jour SQL et ainsi être évaluées par la base de données. Cependant au moment où cela a été grâce à la magie d'enregistrement actif, il apparaît comme:

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

En d'autres termes, les citations sont échappés. Ceci est très bien pour les autres colonnes empêche l'injection sql, mais pas pour cela. Les valeurs sont garantis flotteurs, et je veux la mise à jour pour ressembler à:

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

Ainsi est-il un moyen de transformer échapper au large pour une colonne particulière? Ou une meilleure façon de le faire?

(Je l'ai essayé d'utiliser GeoRuby + adaptateur spatiale et l'adaptateur spatiale semble trop bogué pour moi, plus je ne ai pas besoin de toutes les fonctionnalités - donc essayer de le faire directement).

Créé 27/08/2009 à 03:01
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1
  1. Vous pouvez utiliser une méthode after_save, les écrire avec un appel UPDATE SQL direct. Ennuyeux, mais devrait fonctionner.

  2. Vous devriez être en mesure de créer un déclencheur dans votre migration DB en utilisant la méthode « exécuter » ... mais je l'ai jamais essayé.

  3. Fouillez la fonctionnalité de calcul ActiveRecord: max / min / avg, etc. Je ne sais pas si cela vous permet d'économiser beaucoup sur l'appel SQL directe dans after_save. Voir calculations.rb.

  4. Vous pouvez patcher la fonction qui cite les attributs (recherche de PointFromText puis passez la citation). Ceci est assez facile à trouver, commencer par citer toutes les méthodes. Commencez par le #quote_value de base de ActiveRecord.

Créé 27/08/2009 à 08:42
source utilisateur

voix
1

Le Rails adaptateur Spatial devrait mettre en œuvre exactement ce dont vous avez besoin. Bien que, avant de trouver GeoRuby & adaptateur Spatial, je faisais ceci:

  • Avoir deux champs: un champ de texte et un champ réel de la géométrie, sur le modèle
  • Sur un after_savecrochet, j'ai couru quelque chose comme ceci:

    Connection.Execute "mise à jour matable set geom_column = # {} text_column où id = # {id}"

Mais la solution était au- dessus juste un hack, et cela ont des problèmes supplémentaires: Je ne peux pas créer un index spatial si la colonne permet des NULLvaleurs, MySQL ne me laisse pas définir une valeur par défaut sur une colonne de géométrie, et la saveméthode échoue si la colonne de géométrie n'a pas une valeur définie.

Donc , je voudrais essayer GeoRuby & adaptateur Spatial place, ou réutiliser une partie de son code (sur mon cas, je considère que l' extraction de la connaissance SIG MysqlAdapter#quoteméthode à partir du code adaptateur spatial).

Créé 12/09/2009 à 22:02
source utilisateur

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