在我的情况下,我有一个模型产品has_one位置
我使用地理编码器gem搜索距离较近的位置。
请求位置。近([0,0],100)是这样的:
选择位置。*,6371.0*2*ASIN(SQRT(POWER(SIN((0-locations.latitude)*PI()/180 / 2), 2)COS(0*PI()/180)*COS(locations.latitude*PI()/180)*POWER(SIN((1-locations.longitude)*PI()/180 / 2), 2) ))AS距离,CAST(度(ATAN2(RADIANS(经度-1),RADIANS(纬度- 0))) 360十进制)%360 AS方位\"位置\"WHERE(6371.0*2*ASIN(SQRT(POWER(SIN((0-locations.latitude)*PI()/180 / 2), 2)COS(0*PI()/180)*COS(locations.latitude*PI()/180)*POWER(SIN((1-<-PI()/180 / 2), 2) ))
我想这样做:
Product.where(...).joins(:location).dosomething
我怎么做?
Location#near
是命名范围吗?如果是这样,您可以使用
class Product
scope :near, lambda { |coord, dist| joins(:location) & Location.near(coord, dist) }
...
end
然后你可以这样使用它:
Product.near([0, 0], 100)
另一种可能性,因为合并作用域似乎不起作用:
class Product
scope :near, lambda { |coord, dist| where(:id => Location.near(coord, dist).all.map(&:locationable_id) }
...
end
和另一个答案中的用法一样:
Product.near([0, 0], 100)