Ruby on rails 如何在AR请求和联接中使用作用域?

Ruby on rails 如何在AR请求和联接中使用作用域?,ruby-on-rails,activerecord,arel,Ruby On Rails,Activerecord,Arel,在我的情况下,我有一个模型产品有一个位置 我使用地理编码器gem搜索距离较近的位置 请求位置。靠近[0,0],100如下所示: Product.where(...).joins(:location).dosomething 选择位置。*,6371.0*2*ASINSQRTPOWERSIN0-locations.latitude*PI/180/2,2+COS0*PI/180*COSlocations.latitude*PI/180*POWERSIN1-locations.Latitudy*PI/

在我的情况下,我有一个模型产品有一个位置

我使用地理编码器gem搜索距离较近的位置

请求位置。靠近[0,0],100如下所示:

Product.where(...).joins(:location).dosomething
选择位置。*,6371.0*2*ASINSQRTPOWERSIN0-locations.latitude*PI/180/2,2+COS0*PI/180*COSlocations.latitude*PI/180*POWERSIN1-locations.Latitudy*PI/180/2,2作为距离,CastDegrees Tan2 RadiansEnginuide-1,RADIANSlatitude-0+360作为小数%360作为轴承从\locations\WHERE 6371.0*2*ASINSQRTPOWERSIN0-locations.latitude*PI/180/2,2+COS0*PI/180*COSlocations.latitude*PI/180*POWERSIN1-locations.longitude*PI/180/2,2Locationnear是一个命名范围吗?如果是这样,您可以使用&operator将其与您的产品范围合并。我认为这应该奏效:

类产品 作用域:near,lambda{| coord,dist}连接:location&location.nearcoord,dist} ... 终止 然后你可以这样使用它:

Product.near([0, 0], 100)

另一种可能性,因为合并作用域似乎不起作用:

类产品 作用域:near,lambda{| coord,dist |其中:id=>Location.nearcoord,dist.all.map&:locationable_id} ... 终止 和另一个答案中的用法一样:

Product.near([0, 0], 100)

是的,这是一个范围。我尝试了它,得到了3个查询:建议加载5442.1ms选择建议。*来自位置上的建议内部连接位置。locationable_id=建议。id和位置。locationable_type='建议'位置加载186.6ms选择位置。*,6371.0*2*ASINSQRTPOWERSIN0-位置。纬度。。。提案加载4920.5ms选择提案。*从提案中选择提案是什么?你能显示Locationnear的代码吗?建议==产品。Locationnear=>合并作用域似乎不起作用。这可能与近范围内的select有关。请看我的另一个答案。对不起。此解决方案不适用于生产