Geokit плюс Rails 3.1.1, широта и долгота. - PullRequest
1 голос
/ 24 ноября 2011

Я использую geokit-rails3 gem, чтобы найти продукты во всех колледжах в пределах определенного колледжа.Колледж has_many: продукты и продукт принадлежат колледжу, есть еще одна модель категории, в которой has_many products, а продукт принадлежит_категории.Но когда я пытаюсь найти колледж из базы данных на основе addess, используя geokit, он говорит мне, что lat coloumn отсутствует в моей таблице.

Миграция колледжей

 create_table :colleges do |t|
  t.string :name
  t.text :address
  t.string :city
  t.string :state
  t.integer :zipcode

  t.timestamps

Контроллер

     @products = College.within(5, :origin=>@current_product.college.address).product

Ошибка:

     Mysql::Error: Unknown column 'colleges.lat' in 'field list': SELECT `colleges`.*, 
      (ACOS(least(1,COS(0.3223824452162744)*COS(1.2891920858347756)*COS(RADIANS(colleges.lat))*COS(RADIANS(colleges.lng))+
      COS(0.3223824452162744)*SIN(1.2891920858347756)*COS(RADIANS(colleges.lat))*SIN(RADIANS(colleges.lng))+
      SIN(0.3223824452162744)*SIN(RADIANS(colleges.lat))))*3963.19)
      AS distance FROM `colleges`  WHERE ((colleges.lat>18.398868573573203 AND colleges.lat<18.543438426426793 AND colleges.lng>73.78905443427034 AND colleges.lng<73.94147656572967)) AND ((
      (ACOS(least(1,COS(0.3223824452162744)*COS(1.2891920858347756)*COS(RADIANS(colleges.lat))*COS(RADIANS(colleges.lng))+
      COS(0.3223824452162744)*SIN(1.2891920858347756)*COS(RADIANS(colleges.lat))*SIN(RADIANS(colleges.lng))+
      SIN(0.3223824452162744)*SIN(RADIANS(colleges.lat))))*3963.19)
      <= 5))

Любой совет, как решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Все, что Act_as_mappable с Geokit требует поля lat & lnt (они могут быть переопределены, используя разные имена)

см. Верхнюю часть: http://geokit.rubyforge.org/readme.html

Я бы порекомендовал:

add_column :colleges, :lat, :float
add_column :colleges, :lng, :float
add_index  :colleges, [:lat, :lng]

Также для автоматического обновления адреса:

before_save :update_location

def update_location
 #you probably you to use a full address, or join all the address parts instead of just self.address
 loc=Geocoder.geocode(self.address)
 if loc.success
   self.lat = loc.lat
   self.lng = loc.lng
 end
end
0 голосов
/ 24 ноября 2011

Вы также можете иметь разные столбцы и сопоставить их с act_as_mappable следующим образом:

acts_as_mappable  :default_units => :miles,
                  :default_formula => :sphere,
                  :distance_field_name => :distance,
                  :lat_column_name => :lat,
                  :lng_column_name => :lng
...