Geocoder .near () вызывается из действия контроллера, вызывая синтаксическую ошибку MySQL - Rails 5.2 - PullRequest
0 голосов
/ 03 мая 2018

Я работаю над проектом Rails 5.2 с моделью Place, которая геокодируется гемом Geocoder .

Пока что все работает хорошо, за исключением случаев, когда я запускаю Place.near("a valid location") из поиска обработки контроллера, я получаю следующую ошибку:

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*, 6371.0 * 2 * ASIN(SQRT(POWER(SIN((-31.9575512 - places.latitude) * PI() / ' at line 1: SELECT COUNT(places.*, 6371.0 * 2 * ASIN(SQRT(POWER(SIN((-31.9575512 - places.latitude) * PI() / 180 / 2), 2) + COS(-31.9575512 * PI() / 180) * COS(places.latitude * PI() / 180) * POWER(SIN((115.9160093 - places.longitude) * PI() / 180 / 2), 2))) AS distance, MOD(CAST((ATAN2( ((places.longitude - 115.9160093) / 57.2957795), ((places.latitude - -31.9575512) / 57.2957795)) * 57.2957795) + 360 AS decimal), 360) AS bearing) FROM `places` WHERE (places.latitude BETWEEN -32.13741552118375 AND -31.777686878816255 AND places.longitude BETWEEN 115.7040152609056 AND 116.12800333909439 AND (6371.0 * 2 * ASIN(SQRT(POWER(SIN((-31.9575512 - places.latitude) * PI() / 180 / 2), 2) + COS(-31.9575512 * PI() / 180) * COS(places.latitude * PI() / 180) * POWER(SIN((115.9160093 - places.longitude) * PI() / 180 / 2), 2)))) BETWEEN 0.0 AND 20)

Эта точная строка отлично работает при запуске из консоли Rails ...

Любые идеи о том, почему разница будет высоко ценится.

Место Модель

class Place < ApplicationRecord
  ...

  geocoded_by :full_address
  after_validation :geocode

  reverse_geocoded_by :latitude, :longitude do |obj, results|
    if geo = results.first
      obj.place_id = geo.place_id
    end
  end
  after_validation :reverse_geocode

  def full_address
    "#{title}, #{street_address}, #{suburb} #{state} #{zip}, #{country}"
  end

  ...
end

SearchController

class SearchController < ApplicationController
  def search
    # places = Place.all
    # places = places.where('title LIKE ?', "%#{params[:title]}%") if params[:title].present?
    # places = places.near(params[:location]) if params[:location].present?

    @places = Place.near("Perth, Western Australia")

    # @places = places
  end
end

Обновление

С момента публикации этого вопроса я обнаружил, что вызов .inspect печатает полный ActiveRecord :: Relation, и в консоли и в представлении (то есть: с .near, вызываемым из контроллера ) и вызов .count приводит к появлению вышеуказанной ошибки и в консоли и в представлении. Я думаю, что это немного меняет цитату ...

Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 03 мая 2018

Похоже, что построение области действия near с помощью geocode gem и расчет Rails по отношениям не очень хорошо сочетаются.

Просто заставьте Rails загрузить отношение перед вызовом дополнительных методов, таких как any? или blank?.

@places = Place.near("Perth, Western Australia").load

И используйте @places.size вместо @places.count в вашем представлении, потому что size не запускает дополнительный запрос к базе данных, но возвращает массив элементов, когда отношение уже загружено.

...