ThinkingSphinx: запуск SQL-строки через ассоциацию - PullRequest
2 голосов
/ 03 апреля 2011

Я пытаюсь заставить гео-поиск работать через ассоциацию. Очень похоже на этого парня:

Как выполнить гео-поиск в нескольких моделях с ThinkingSphinx?

Единственное отличие состоит в том, что я пытаюсь объединить синтаксис ассоциации с пользовательским синтаксисом SQL. Он не печатает никаких ошибок при индексации, но когда я пытаюсь выполнить поиск, происходит сбой:

class Person
  define_index do
    indexes tags(:text), :as => :tags

    has media.location.lat('RADIANS(location.lat)'), :as => :lat, :type => :float
    has media.location.lng('RADIANS(location.lng)'), :as => :lng, :type => :float
  end

  sphinx_scope(:by_location) { |loc|
    { :geo => [loc.lat.to_radians, loc.lng.to_radians],
      :with => {"@geodist" => 0.0..loc.radius },
      :latitude_attr => "lat",
      :longitude_attr => "lng"
    }
  }
end

#running this search from console
Person.by_location(Location.first)

Это ошибка:

ThinkingSphinx :: SphinxError: индекс выполнения_кор: неизвестный атрибут широты 'широта *

Я пытался настроить его без строки SQL - это работает без ошибок, но математика, конечно, совершенно неверна, поскольку она пытается выполнять операции с радианами в градусах.

Есть ли способ объединить преобразование и ассоциацию, или я застрял, храня свои данные в радианах, а не в градусах?

1 Ответ

3 голосов
/ 03 апреля 2011

Ваше определение индекса не совсем верно.Попробуйте следующее:

define_index do
  indexes tags(:text), :as => :tags

  # forces the join on media and location associations
  join media.location

  has 'RADIANS(location.lat)', :as => :lat, :type => :float
  has 'RADIANS(location.lng)', :as => :lng, :type => :float
end
...