Rails Mysql2 ::错误:使用count来获取组

时间:2018-01-25 01:39:55

标签: mysql ruby-on-rails ruby activerecord rails-geocoder

当我在附近寻找一个地方附近的维修店时,我发现群体和计数突然出错。我正在使用geocoder gem在创建时对修复进行地理编码。

假设我将查询称为:

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

我得到正确的结果为哈希:{"my title" => 1},一切都很好,花花公子。

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

让我分步说明:

  1. Repairshop.where(:approved => true)。在附近(' syracuse',200)
  2.   

    提供与我的标题维修店的活动记录关系,它的工作原理   用近乎查询来查找。

    1. 用group(:city)链接后,我得到的结果如下所示:
    2. enter image description here

      1. 现在,当我尝试像它一样对它进行计数:

        Repairshop.where(:approved => true)。在(' syracuse',200).group(:city).count

      2. 我收到以下错误:

        enter image description here

          

        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 WHERE repairshopsapproved = 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之间   repairshopscity ORDER BY距离ASC

        Repairshop模型类看起来像这样,我已经安装了地理编码器gem:

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

        在SQLite中,一切都运行得很好,但在链接时会出错。我没有直接使用MySQL语法,所以不知道问题出在哪里。

        注意:我正确地进行了MySQL2设置并使用本地服务器进行开发。组(:field).count适用于与位置无关的其他字段

        非常感谢您的帮助。

2 个答案:

答案 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]),然后运行分组和计数

但如果有人能提出更好的解决方案。真的很感激!