steps rails new generate first examples create mysql ruby-on-rails ruby-on-rails-3 postgresql gmaps4rails

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 .