私は次のモデルを持っています:
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
しかし、これは良いアプローチですか?もしそうなら、どうすれば通過した都市の近くで教授を注文することができますか?