Rails, Geocoder - 获取靠近其他记录的记录并按第二组记录分组
Rails, Geocoder - get records near other records and group by the second set of records
我有两个模型,users
和 locations
彼此没有联系,它们都有 latitude
和 longitude
列。
我需要查询给定半径内的所有 users
和所有 locations
,并按 locations
对它们进行分组
实际上,我需要一组结果,将具有相同 locations
的 users
分组到
的特定半径范围内
将有足够多的 users
简单地迭代它们是不切实际的,所以我正在寻找 SQL 或 Rails 选择它们的方法
我正在使用 rails 地理编码器 (https://github.com/alexreisner/geocoder)
问题被否决了,但我会post我最终得到的答案
我不得不放弃地理编码器 gem,因为它不能很好地处理 plucks 或 selects,只能手动使用等式,最终使用:
User.select("ARRAY_AGG(users.id) as user_list, (SELECT array(SELECT locations.id from locations WHERE (6371.0 * 2 * ASIN(SQRT(POWER(SIN((users.latitude - locations.latitude) * PI() / 180 / 2), 2) + COS(users.latitude * PI() / 180) * COS(locations.latitude * PI() / 180) * POWER(SIN((users.longitude - locations.longitude) * PI() / 180 / 2), 2)))) <= CAST(<whatever radius> AS float))) as location_list").group("location_list")
我有两个模型,users
和 locations
彼此没有联系,它们都有 latitude
和 longitude
列。
我需要查询给定半径内的所有 users
和所有 locations
,并按 locations
实际上,我需要一组结果,将具有相同 locations
的 users
分组到
将有足够多的 users
简单地迭代它们是不切实际的,所以我正在寻找 SQL 或 Rails 选择它们的方法
我正在使用 rails 地理编码器 (https://github.com/alexreisner/geocoder)
问题被否决了,但我会post我最终得到的答案
我不得不放弃地理编码器 gem,因为它不能很好地处理 plucks 或 selects,只能手动使用等式,最终使用:
User.select("ARRAY_AGG(users.id) as user_list, (SELECT array(SELECT locations.id from locations WHERE (6371.0 * 2 * ASIN(SQRT(POWER(SIN((users.latitude - locations.latitude) * PI() / 180 / 2), 2) + COS(users.latitude * PI() / 180) * COS(locations.latitude * PI() / 180) * POWER(SIN((users.longitude - locations.longitude) * PI() / 180 / 2), 2)))) <= CAST(<whatever radius> AS float))) as location_list").group("location_list")