提问者:小点点

Rails Mysql2::错误:使用计数获取组


当我使用near搜索某个地方附近的修理厂时,我在group and count中遇到了一个突然错误。我正在使用geocoder gem对创建时的修理厂进行地理编码。

假设我将查询称为:

Repairshop.where(:approved => true).group(:title).count

我得到了正确的哈希结果:{“我的标题”=

现在,当我调用城市或州的组,然后计算结果时,我得到一个Mysql2错误:

让我分步骤展示:

  1. Repairshop.where

给出了与my title repairshop的活动记录关系,它在查找近查询时工作良好。

现在,当我试图依赖它时,就像:

Repairshop.where(:核准=

我得到以下错误显示如下:

MySQL2::Error:您有一个错误,在您的SQL语法;检查手册,对应于您的MySQL服务器版本的正确语法使用附近'*,3958.755864232 * 2*ASIN(SQRT(POWER(SIN((43.0481221-<--plhd--1*,3958.755864232 * 2*ASIN(SQRT(POWER(SIN((43.0481221-repairshops.latitude)*PI()/180 / 2), 2)COS(43.0481221*PI()/180)*COS(repairshops.latitude*PI()/180)*POWER(SIN((-76.14742439999999-repairshops.longitude)*PI()/180 / 2), 2)))AS距离,MOD(CAST((ATAN2((repairshops.longitude- -76.14742439999999) / 57.2957795), (( repairshops.latitude- 43.0481221) / 57.2957795)) * 57.2957795) 360AS十进制),360)AS轴承)AScount_repairshops_all_3958_755864232_all_2_all_asin_sqrt_power_sin_43_0481221_repairshops_latitude_all_pi_180_2_2_cos_43_0481221_all_pi_180_all_cos_repairshops_latitude_all_pi_180_all_power_sin_76_14742439999999_repairshops_longitude_all_pi_180_2_2_as_dis,市AS市从修理厂WHERE修理厂。(repairshops.latitude40.153486437783044和45.94275776221696和repairshops.longitude-80.10844293387429和-72.1864058661257和(3958.755864232*2*ASIN(SQRT(POWER(SIN((43.0481221-repairshops.latitude)*PI()/180/2),2)COS(43.0481221*PI()/180)*COS(repairshops.latitude*PI()/180)*POWER(SIN((-76.14742439999999-repairshops.longitude)*PI()/180/2),2))))0.0和200之间)GROUP BY修理厂.城市ORDER BY距离ASC

Repairshop模型类如下所示,我已经安装了geocoder gem:

class Repairshop < ActiveRecord::Base
    geocoded_by :full_address
    after_validation :geocode


end

在SQLite中,一切都运行完美,但在这里,当链接时,它会给出一个错误。我没有直接使用MySQL语法,所以不明白问题在哪里。

注意:我正确地安装了MySQL2,并使用了本地服务器进行开发。组(:字段)。对于与位置无关的其他字段,计数可以正常工作

会非常感谢你的帮助。


共2个答案

匿名用户

Geocodergem似乎正在以与#group不兼容的方式重写select子句。使用子选择可能是一种解决方案:

Repairshop.where(
  id: Repairshop.where(
    :approved => true
  ).near(
    'syracuse', 200
  ).select(:id)
).group(
  :city
).count

匿名用户

工作解决方案是使用:

修理厂。其中(id:repairshop.near(参数[:位置],参数[:半径])。映射{i | i.id})而不是修理厂。靠近(参数[:位置]、参数[:半径])然后运行组和计数

但如果有人能提出更好的解决方案。我会非常感激的!