I have a product model and a shop model. The relationship between two is shop has_many products and products belongs_to shop.
The shop model has two fields longitude and latitude used for distance calculation using geokit-rails. I have been successful in sorting shops by nearest distance to any given longitude and latitude using:
Shop.by_distance(origin:[params[:latitude], params[:longitude]]).sort_by{|s| s.distance_to([params[:latitude], params[:longitude]])}
The problem is with products. The products needs to be sorted according to nearest shop location as well. I have searched through and found out that a child model can be sorted from parents attributes like this:
Product.joins(:shop).order('shops.name')
The order function works only if supplied with model field. How can I sort products calculating shop distance.
Please help.
Have a look at the documentation on using :through - this should be exactly what you need.
So Product would look like:
class Product < ActiveRecord::Base
belongs_to :shop
acts_as_mappable through: :shop
...
end
And your query would be something like:
Product.joins(:shop).by_distance(origin: [params[:latitude], params[:longitude]])