我现在有效的解决方案可能不是最好的,只是找不到其他解决方案:
address = [lat, long]
users.each do |u|
if u.distance_to(address, :units => :kms) < u.distance
tutors << t
end
end
它是如何工作的:用户表有一个名为距离的字段,我在其中保留一个整数,显示用户覆盖的半径,例如:20。在进行搜索时,我从表单发送纬度和长参数以查找位置map,然后只是循环遍历用户以查找他们与该点之间的距离小于距离值的所有用户。
例如:用户 1 的范围是 20 公里,因此距离值为 20,然后检查用户 1 与地图上的点之间的距离是否小于 20,将他加载到数组中。
我不需要太多的用户来循环,因为我在之前的代码中限制了他们的数量,所以我只得到其中的几个......最大在 1 到 40 之间。
现在它有效,如果有人有更好的解决方案,请分享。
更好的解决方案:
def find_tutors
lat_d = Geokit::Mappable::LATITUDE_DEGREES
km_lat = Geokit::Mappable::KMS_PER_LATITUDE_DEGREE
kms_per_mile = Geokit::Mappable::KMS_PER_MILE
users = User.joins(:courses).where("courses.lesson ILIKE ?", "%#{lesson}%")
if long.present?
users = users.where("pow((longitude - ?) * (#{lat_d} * #{kms_per_mile} * abs(cos(0.0174 * longitude))), 2) +
pow((latitude - ?) * #{km_lat}, 2) < pow(distance, 2)",
long, lat)
end
users
end
在上述情况下,longitude
和latitude
是搜索模型的属性,但也可以是任何其他属性。