2015-11-02 79 views
0

我使用postgis根据距离用户的距离对数据进行排序。由于postgis在返回信息之前计算距离,有没有办法在返回信息时将值设置为距离属性?我不希望它被存储在数据库中,只是想在检索时设置它。这就是我用来在我的模型中进行排序的东西。提前致谢。使用Postgis + Rails在模型上设置距离属性

scope :distance, ->(userLat, userLng) { 
order(
%{ 
ST_Distance_Sphere(
    ST_GeomFromEWKT(
    'SRID=4326;POINT(' || properties.lng || ' ' || properties.lat || ')' 
), 
    ST_GeomFromEWKT('SRID=4326;POINT(%f %f)') 
) 
} % [userLng, userLat]) 
} 

回答

0

不,如果该值由Postgres计算,那么Postgres显然必须在排序过程中计算它。如果你没有将距离计算作为字段去规范化你的数据库,那么你可以创建一个数据库视图,并将模型放在其上。

create view properties_distance as 
    select ST_Distance_Sphere(
    ST_GeomFromEWKT(
     'SRID=4326;POINT(' || properties.lng || ' ' || properties.lat || ')' 
    ), 
    ST_GeomFromEWKT('SRID=4326;POINT(%f %f)') 
) as distance, lng, lat from properties; 
+0

你是什么意思反规范化?我试图避免保存字段,因为每个查询应根据用户位置有不同的距离结果。而且因为我使用rails,因为我的api是另一种方法而不是视图? –

+0

视图基本上是你的数据库的非规范化视图。由于你必须在数据库中使用Postgres GEO来计算它,所以你可以像你一样在你的select子句中计算它,或者利用db视图来为你做。它们都是几乎相同的东西。视图方法看起来更干净但不会更快 –