Pregunta

Utilizo con éxito la gema gmaps4rails en mi máquina MySQL local.Sin embargo, cuando implemento en PG en Heroku, aparece el siguiente error con respecto al código que usa la función "cerca" de gmaps4rails para buscar ubicaciones cercanas a la ubicación seleccionada:

2012-05-21T17:58:40+00:00 app[web.1]: ActiveRecord::StatementInvalid (PG::Error: ERROR:  operator does not exist: numeric - character varying
2012-05-21T17:58:40+00:00 app[web.1]:                                                              ^
2012-05-21T17:58:40+00:00 app[web.1]: LINE 1: ...8.755864232 * 2 * ASIN(SQRT(POWER(SIN((30.1926300 - venues.l...
2012-05-21T17:58:40+00:00 app[web.1]: HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
2012-05-21T17:58:40+00:00 app[web.1]: : SELECT  venues.*, 3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((30.1926300 - venues.latitude) * PI() / 180 / 2), 2) + COS(30.1926300 * PI() / 180) * COS(venues.latitude * PI() / 180) * POWER(SIN((-85.8356740 - venues.longitude) * PI() / 180 / 2), 2) )) AS distance, CAST(DEGREES(ATAN2( RADIANS(longitude - -85.8356740), RADIANS(latitude - 30.1926300))) + 360 AS decimal) % 360 AS bearing FROM "venues"  WHERE (3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((30.1926300 - venues.latitude) * PI() / 180 / 2), 2) + COS(30.1926300 * PI() / 180) * COS(venues.latitude * PI() / 180) * POWER(SIN((-85.8356740 - venues.longitude) * PI() / 180 / 2), 2) )) <= 5) ORDER BY distance LIMIT 5):
2012-05-21T17:58:40+00:00 app[web.1]:   app/controllers/venues_controller.rb:22:in `show'

Sospecho que esto se debe a que algo no es compatible con esta consulta en Postgres, pero la gema supuestamente es compatible con Postgres.¿Tienes idea de lo que está pasando?

¿Fue útil?

Solución

Parece que PostgreSQL se queja de esto:

30.1926300 - venues.latitude

y el mensaje de error dice que no existe ningún operador que permita restar una cadena a un número.Supongo que has creado tu venues.latitude columna como :string cuando debería ser un :float o :decimal.MySQL intenta ser amigable haciendo muchas conversiones de tipos implícitas a tus espaldas, PostgreSQL intenta ser amigable haciéndote decir exactamente lo que quieres decir para evitar confusiones.

Vas a tener que cambiar tu latitude columna a un tipo numérico.Entonces deberías comenzar a desarrollar sobre PostgreSQL, si vas a implementar sobre PostgreSQL de Heroku, también debes hacer coincidir la versión de PostgreSQL en tus entornos de desarrollo e implementación.

AFAIK, tendrás que cambiar el tipo manualmente con un ALTERAR TABLA como un simple change_column en una migración probablemente fallará con un error similar a

la columna "latitud" no se puede convertir para escribir con doble precisión

Una migración como esta:

def up
    connection.execute(%q{
        alter table venues
        alter column latitude
        type float using latitude::float
    })
end

Debería funcionar para PostgreSQL.Presumiblemente tendrás que arreglar venues.longitude también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top