2

私は次のモデルを持っています:

class User
 has_one :player
 belongs_to :city
end

class Player
 belongs_to :user
end

class City
 has_many :users
end

各都市には緯度経度の属性があります。

次のクエリがあります(少し長くなりますが、重要なのは都市の部分です)。これを使用して、特定の都市の関連ユーザーをプレーヤーに取得します。このように:

def self.search(city)
  self.includes(:user => :city).
  where(['cities.name = ?', city])
end

このクエリを変更して、特定の都市の近くにあるユーザー(たとえば、10 km)の教授を取得するにはどうすればよいですか?

編集:私は都市モデルにこのメソッドを持っています。これは、特定の半径(km)、緯度、経度を指定して最も近い都市を提供します。

  def near_by(latitude,longitude,radius)
    City.select("cities.*,
                6371 *
                acos(cos(radians(#{latitude})) *
                cos(radians(cities.latitude)) *
                cos(radians(cities.longitude) - radians(#{longitude})) +
                sin(radians(#{latitude}))*sin(radians(cities.latitude)))
                AS km_away").group('km_away ASC').having('km_away <= ?', radius)
  end

EDIT2:両方のクエリを組み合わせるためにこれまでに持っているものは次のとおりです。

# Pass a city object to the search instead of a city name, so we can use lat and long

def self.search(city)
  self.includes(:user => :city).
  where(['cities.id IN (?)', City.near_by(city.latitude,city.longitude)])
end

しかし、これは良いアプローチですか?もしそうなら、どうすれば通過した都市の近くで教授を注文することができますか?

4

1 に答える 1

0

地理データの操作については、このrailscastで説明されているGeocoder gemを確認することをお勧めします。

readme から: ジオコーディングされたオブジェクトを使用すると、次のようなことができます。

obj.nearbys(30)                      # other objects within 30 miles
obj.distance_from([40.714,-100.234]) # distance from arbitrary point to object
obj.bearing_to("Paris, France")      # direction from object to arbitrary point
于 2012-07-20T10:58:07.113 に答える