使用 Postgis + Rails 在模型上设置距离属性
Setting distance attribute on model using Postgis + Rails
我正在使用 postgis 根据与用户的距离对数据进行排序。由于 postgis 在返回信息之前计算距离,有没有办法在返回信息时将值设置为距离属性?我不想将其存储在数据库中,只希望在检索时对其进行设置。这就是我用来在我的模型中进行排序的方法。提前致谢。
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])
}
不,如果值是由 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;
我正在使用 postgis 根据与用户的距离对数据进行排序。由于 postgis 在返回信息之前计算距离,有没有办法在返回信息时将值设置为距离属性?我不想将其存储在数据库中,只希望在检索时对其进行设置。这就是我用来在我的模型中进行排序的方法。提前致谢。
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])
}
不,如果值是由 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;