Rails基于父模型距离计算对子模型进行排序

时间:2017-03-28 09:44:39

标签: mysql ruby-on-rails sorting geokit

我有product模型和shop模型。两者之间的关系是商店has_many商品和商品belongs_to商店。

商店模型有两个字段longitudelatitude用于使用geokit-rails进行距离计算。我使用以下方法成功地按照与任何给定经度和纬度的最近距离对商店进行分类:

Shop.by_distance(origin:[params[:latitude], params[:longitude]]).sort_by{|s| s.distance_to([params[:latitude], params[:longitude]])}

问题在于产品。产品需要根据最近的商店位置进行分类。我搜索过并发现可以从父类属性中对子模型进行排序:

Product.joins(:shop).order('shops.name')

订单功能仅在与模型字段一起提供时才有效。如何对计算店铺距离的产品进行分类。

请帮忙。

2 个答案:

答案 0 :(得分:3)

查看using :through上的文档 - 这应该是您所需要的。

所以Product看起来像是:

class Product < ActiveRecord::Base
  belongs_to :shop
  acts_as_mappable through: :shop
  ...
end

您的查询类似于:

Product.joins(:shop).by_distance(origin: [params[:latitude], params[:longitude]])

答案 1 :(得分:1)

如果您已经可以对商店进行过滤和排序

@shops = Shop.by_distance(origin:[params[:latitude], params[:longitude]]).sort_by{|s| s.distance_to([params[:latitude], params[:longitude]])}

这将根据距离从每个商店获得所有产品:

@closest_products = @shops.map(&:products)

如果您想清除重复的产品,请改用:

@closest_products = @shops.map(&:children).flatten.uniq

你可以尝试另一种方法(我没有测试过这个):

@closest_products = Product.where(shop: @shops)
相关问题