当我在附近寻找一个地方附近的维修店时,我发现群体和计数突然出错。我正在使用geocoder gem在创建时对修复进行地理编码。
假设我将查询称为:
Repairshop.where(:approved => true).group(:title).count
我得到正确的结果为哈希:{"my title" => 1}
,一切都很好,花花公子。
现在,当我在城市或州调用群组然后依靠结果时,我得到一个Mysql2错误:
让我分步说明:
提供与我的标题维修店的活动记录关系,它的工作原理 用近乎查询来查找。
现在,当我尝试像它一样对它进行计数:
Repairshop.where(:approved => true)。在(' syracuse',200).group(:city).count
我收到以下错误:
Mysql2 ::错误:您的SQL语法中有错误;检查手册 对应于您的MySQL服务器版本,以获得正确的语法 使用靠近' *,3958.755864232 * 2 * ASIN(SQRT(POWER(SIN)(43.0481221 - repairshops.latitude)'在第1行:SELECT DISTINCT COUNT(DISTINCT repairhops。*,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)+ 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_sin_76_14742439999999_repairshops_longitude_all_pi_180_2_2_as_dis, city AS city FROM
repairshops
WHERErepairshops
。approved
= 1 AND (repairshops.latitude BETWEEN 40.153486437783044和45.94275776221696 AND repairshops.longitude BETWEEN -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)* POWER(SIN(( - 76.14742439999999 - repairshops.longitude)* PI()/ 180/2),2))))0.0和200)GROUP BY之间repairshops
。city
ORDER BY距离ASC
Repairshop模型类看起来像这样,我已经安装了地理编码器gem:
class Repairshop < ActiveRecord::Base
geocoded_by :full_address
after_validation :geocode
end
在SQLite中,一切都运行得很好,但在链接时会出错。我没有直接使用MySQL语法,所以不知道问题出在哪里。
注意:我正确地进行了MySQL2设置并使用本地服务器进行开发。组(:field).count适用于与位置无关的其他字段
非常感谢您的帮助。
答案 0 :(得分:1)
Geocoder
gem似乎以与#group
不兼容的方式重写了select子句。使用子选择可能是一个解决方案:
Repairshop.where(
id: Repairshop.where(
:approved => true
).near(
'syracuse', 200
).select(:id)
).group(
:city
).count
答案 1 :(得分:0)
工作解决方案是使用:
Repairshop.where(id: repairshop.near(params[:location], params[:radius]).map{|i| i.id})
代替Repairshop.near(params[:location], params[:radius])
,然后运行分组和计数
但如果有人能提出更好的解决方案。真的很感激!