我尝试在Rails应用程序中使用空间距离,但总是遇到"ActiveRecord::UnknownAttributeReference:使用非属性参数调用查询方法"错误。
下面是我的代码:
def nearby_locations
third_party_location_query = ThirdPartyLocation.where(id: id).select('geom').to_sql
third_party.organisation.locations.active.
select("locations.*, ROUND(ST_DistanceSphere(locations.geom, (#{third_party_location_query}))::numeric, 0)::integer distance").
order("locations.geom <-> (#{third_party_location_query})").
limit(10).as_json(methods: [:distance])
end
我知道这个错误是由于向order方法传递了一个非属性值而引起的,但是我不确定在这种情况下如何避免它。我怎样才能在查询中使用空间距离而不遇到这个错误呢?
1条答案
按热度按时间lsmd5eda1#
从Rails 6.0开始,如果不传递
Arel
对象,就不能在order
语句中使用非列引用。在您的情况下,选项包括:
我们甚至可以将这部分转换为arel,但它不会很漂亮
对于其他偶然发现这篇文章的人:
请注意
Arel#sql
不会执行转义。如果由于
third_party_location_query
来自第三方并且可能存在危险而需要对其进行转义,则可以并且应该使用其他技术来净化此数据:例如,如果不需要括号,则:
应该行得通。
如果需要括号,并且参数是单数或参数是逗号分隔的,则
根据实现的不同,还有许多其他方法可以处理所需的转义。