Rails - 连接城市表的现有查询中的邻近城市

时间:2012-07-19 23:51:14

标签: ruby-on-rails-3 join

我有以下型号:

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公里)给定城市的教授?

编辑:我在城市模型中有这种方法,它给出了给定特定半径(公里),纬度和经度的最近城市:

  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

但这是一个好方法吗?如果是这样的话,我怎么能通过靠近被通过的城市来命令教授?

1 个答案:

答案 0 :(得分:0)

对于使用地理数据,我建议您按照Geocoder gem中的说明查看railscast

自述文件: 使用地理编码对象,您可以执行以下操作:

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