Rails 根据父模型距离计算对子模型进行排序
Rails sort child model based on parent model distance calculation
我有一个 product
模型和一个 shop
模型。两者的关系是shophas_many
products和productsbelongs_to
shop.
商店模型有两个字段longitude
和latitude
用于使用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')
订单功能仅在提供模型字段时有效。如何根据商店距离对产品进行排序。
请帮忙。
如果您已经可以对商店进行筛选和排序
@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)
查看 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]])
我有一个 product
模型和一个 shop
模型。两者的关系是shophas_many
products和productsbelongs_to
shop.
商店模型有两个字段longitude
和latitude
用于使用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')
订单功能仅在提供模型字段时有效。如何根据商店距离对产品进行排序。
请帮忙。
如果您已经可以对商店进行筛选和排序
@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)
查看 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]])