mysql - new - Rails-gema gmaps4rails en postgres
ruby on rails database (1)
Utilicé con éxito la gema gmaps4rails en mi máquina MySQL local. Sin embargo, cuando despliegue en PG en Heroku, aparece el siguiente error con respecto al código que usa la función "near" de gmaps4rails para buscar ubicaciones cerca de 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 algo que no se admite en esta consulta en postgres, pero la gema supuestamente admite postgres. ¿Tienes idea de lo que está pasando?
Parece que PostgreSQL se queja de esto:
30.1926300 - venues.latitude
y el mensaje de error dice que no hay ningún operador que le permita restar una cadena de un número. Supongo que ha creado su columna de venues.latitude
como :string
cuando debería ser a :float
o :decimal
. MySQL intenta ser amistoso al hacer muchas conversiones de tipo implícitas a sus espaldas, PostgreSQL intenta ser amigable al hacerle decir exactamente lo que quiere decir para evitar confusiones.
Tendrá que cambiar su columna de latitude
por un tipo numérico. Entonces debería comenzar a desarrollar sobre PostgreSQL si va a implementar sobre PostgreSQL de Heroku, también debería coincidir con la versión de PostgreSQL en sus entornos de desarrollo e implementación.
AFAIK, tendrás que cambiar el tipo manualmente con ALTER TABLE, ya que una simple change_column
en una migración probablemente fallará con un error similar al
la columna "latitud" no se puede convertir para escribir 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 hacer el truco para PostgreSQL. Es de suponer que también tendrás que arreglar los venues.longitude
.