1

我在本地 MySQL 机器上成功使用了 gmaps4rails gem。但是,当我在 Heroku 上部署到 PG 时,对于使用 gmaps4rails“near”函数查找所选位置附近的位置的代码,我收到以下错误:

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'

我怀疑这是因为 postgres 中的此查询不支持某些内容,但据说 gem 支持 postgres。知道发生了什么吗?

4

1 回答 1

4

看起来 PostgreSQL 正在抱怨这个:

30.1926300 - venues.latitude

并且错误消息说没有运算符可以让您从数字中减去字符串。我猜你已经将你的venues.latitude列创建为 a:string当它应该是 a:float:decimal。MySQL 试图友好地在你背后做很多隐式类型转换,PostgreSQL 试图友好地让你准确地说出你的意思以避免混淆。

您将不得不将latitude列更改为数字类型。如果你要在 Heroku 的 PostgreSQL 上进行部署,那么你应该开始在 PostgreSQL 上进行开发,你还应该在你的开发和部署环境中匹配 PostgreSQL 版本。

AFAIK,您必须使用ALTER TABLE手动更改类型,因为迁移中的简单操作change_column可能会失败,并出现类似于以下的错误

列“纬度”不能转换为双精度类型

像这样的迁移:

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

应该为 PostgreSQL 解决问题。大概你也必须修复venues.longitude

于 2012-05-21T18:16:07.507 回答