当我在附近搜索某处附近的维修店时,我突然出现组和计数错误。我正在使用geocoder gem在创建时对维修店进行地理编码。
假设我将查询称为:
Repairshop.where(:approved => true).group(:title).count
我得到正确的结果为hash:
{"my title" => 1}
一切都很好,很花哨。现在,当我在城市或州呼叫group,然后依靠结果时,出现Mysql2错误:
让我逐步显示它:
Repairshop.where(:approved => true).near('syracuse',200)
提供与我的标题维修店的活动记录关系,并且有效
很好,可以通过近距离查询找到。
与group(:city)链接后,得到的结果如下所示:
现在,当我尝试像这样链接它时:
Repairshop.where(:approved => true).near('syracuse',200).group(:city).count
我收到以下错误消息:
Mysql2 :: Error:您的SQL语法有错误;查看手册
对应于您的MySQL服务器版本的正确语法,
在'*,3958.755864232 * 2 * ASIN(SQRT(POWER(SIN((43.0481221-
第1行:“ SELECT DISTINCT COUNT(DISTINCT)”
修理厂。*,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)*
电源(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)+ 360 AS十进制),360)AS轴承)AS
count_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_s__in_76_1474243999
城市AS城市FROM
repairshops
WHERE repairshops
。approved
= 1 AND(repairshops.latitude在40.153486437783044和45.94275776221696之间
AND repairshops.longitude -80.10844293387429 AND之间
-72.1864058661257 AND(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)*电源(SIN((-76.14742439999999-repairshops.longitude)*
PI()/ 180/2),2))))在0.0和200)之间分组
repairshops
。city
按距离ASC排序Repairshop模型类如下所示,我已经安装了地址解析器gem:
class Repairshop < ActiveRecord::Base
geocoded_by :full_address
after_validation :geocode
end
一切在SQLite中都可以正常运行,但是在链接时会出现错误。我没有直接使用MySQL语法,所以不知道问题出在哪里。
注意:我正确地进行了MySQL2的安装,并使用了本地服务器进行开发。 group(:field).count适用于与位置无关的其他字段
会非常感谢您的帮助。
最佳答案
Geocoder
gem似乎正在以与#group
不兼容的方式重写select子句。使用子选择可能是一种解决方案:
Repairshop.where(
id: Repairshop.where(
:approved => true
).near(
'syracuse', 200
).select(:id)
).group(
:city
).count