我有一些代码:
if @sort_by == 'distance'
Opportunity.upcoming_unsorted \
.is_geocoded \
.near([@query_location.latitude, @query_location.longitude], MilesRadius) \
.paginate(:page => @page, :per_page => PerPage)
else # Opp. date
Opportunity.upcoming_unsorted \
.is_geocoded \
.near([@query_location.latitude, @query_location.longitude], MilesRadius, :order => false) \
.order('opportunity_date') \
.paginate(:page => @page, :per_page => PerPage)
end
我想知道是否可以在一个rails模型搜索中执行此操作,而不是将条件放在if @sort_by上。
基本上,我正在为用户提供按地理距离(由地理编码器宝石提供支持)或模型上的“opportunity_date”字段进行排序的选项。并想知道是否可以使用rails 5.0以某种方式简化此代码。注意:地理编码器在rails ORM中提供了一个模型.distance字段,但它不在数据库本身中。
答案 0 :(得分:0)
您可以通过有条件地添加订单条件并以编程方式在08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Column=REAL_COL<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>6037<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.
上设置order
来执行此操作。类似的东西:
.near
答案 1 :(得分:0)
Adam的回答可能适合你,但对我来说,我实际上还有一个更复杂的查询(使用OR条件),我也需要添加。
通常,人们会使用arel_table来完成我们在这里尝试做的事情。在这种情况下,我们不能,因为地理编码器的“近”方法不是兼容的(请告诉我,如果不是这种情况,我会更新答案)。
因此,我最终要做的仍然是使用两个查询加上一个条件。我最终收集了记录的ID,然后在单独的查询中进行排序/分页。 (我试图优化代码清洁度,而不一定是查询效率。)