Geocoder Rails插件 - 使用ActiveRecord的近搜索问题

时间:2010-07-16 15:19:18

标签: sql ruby-on-rails activerecord

这让我感到紧张!

情景:

我正在使用地理编码器插件:http://github.com/alexreisner/geocoder/
我有两个模型:地址和项目
纬度和经度在地址和Item belongs_to :address

现在,当我尝试近距离搜索时:
Item.near(Person.first.address.coordinates, 20)
在一个项目上它失败并带有以下SQL:
“字段列表”中的未知列“纬度”:

SELECT *, 3956 * 2 * ASIN(SQRT(POWER(SIN((51.3883 - latitude) * PI() / 180 / 2), 2) + COS(51.3883 * PI()/180) * COS(latitude * PI() / 180) * POWER(SIN((6.65326 - longitude) * PI() / 180 / 2), 2) )) AS distance FROM `items` WHERE ((latitude BETWEEN 51.0984449275362 AND 51.6781550724638 AND longitude BETWEEN 6.188777824785 AND 7.117742175215) AND (`items`.`accepted` IS NULL AND `items`.`taken_by` IS NULL)) ORDER BY distance ASC

不要查看查询中奇怪的数学内容,
问题在于FROM和WHERE子句,因为
纬度和经度属性是地址表的一部分,
因此,对Query的简单添加可以解决问题:

... FROM items, addresses WHERE ...
... null)) AND items.address_id = addresses.id ORDER BY ...

我只想在FROM字段和条件中添加一个表:(
我尝试使用几个named_scopes:include和:join,但没有一个工作!
有人知道解决方案吗?我怎么能将它插入到作用域的ActiveRecord对象中?

1 个答案:

答案 0 :(得分:1)

所以物品有地址,那是经度和纬度实际存在的地方,对吗?这就是我认为查询出错的地方。您可以尝试添加:joins =>:地址...但我更喜欢以下内容:

由于所有数学都发生在数据库中,我认为你可以这样做:

Address.near(Person.first.address.coordinates, 20)

然后获取地址所属的项目,甚至可以是:include =>:item或其他内容。