【问题标题】:Rails - gmaps4rails gem on postgresRails - postgres 上的 gmaps4rails gem
【发布时间】:2012-05-28 06:01:22
【问题描述】:

我在本地 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。知道发生了什么吗?

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3 postgresql gmaps4rails


    【解决方案1】:

    看起来 PostgreSQL 正在抱怨这个:

    30.1926300 - venues.latitude
    

    并且错误消息说没有允许您从数字中减去字符串的运算符。我猜你已经将venues.latitude 列创建为:string,而它应该是:float or :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

    【讨论】:

    • “MySQL 试图友好地在你背后进行大量隐式类型转换,PostgreSQL 试图友好地让你准确说出你的意思以避免混淆。” - 哇! +++++++1 :)
    • @Salil:我不喜欢我的数据库猜测我在做什么或我的意思:损坏的代码是暂时的,损坏的数据是永远的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多