Trader/Service/Location model pitstop

I have a feeling I am gonna get my ass kicked here, but this is my first attempt at creating real life model logic

I have 3 models:

Trader -

Service -

Location -

and my DB Schema is:

This is all I have at the moment and it does exactly what I want it to do. I will plan on my controller and views later but I want to pause and review on my work and could use some help as I am unsure if I am overusing callbacks especially in the Service model and what I could do otherwise.

A quick overview of the plan is:

A Trader has and belongs to many Locations and vice-versa, and a Trader has many Services each of which have a range. This range is the distance a trader may travel to provide the service from their central post_code e.g. a builder might travel 20 miles to build a porch but would travel 50 miles for a customer to build a full house extension. Therefore the Locations for a Trader all hinge on the maximum range of their Services.

The Locations table is populated with UK postcode data with Lat/Lon coordinates and all distances and ranges are calculated using the Haversine formula.

The plan is when a User visits the website they enter their post code, firstly all Traders in the Location will be identified. Then When the user clicks on a specific Trader, the Trader=>‘services_in’ function will be called to only show the services that the trader provides within their post code.

I hope that makes sense and you have a little time to peruse the models, I could really do with having a discussion on what I have created so far to see how smelly my code is. As I say I have never done anything to this level before.

much regards


Hi Jonlee,

At first sight, all I have to say is that your Location model could be greatly simplified with the use of the geocoder gem. It provides great functionalities when dealing with GPS coordinates, especially computing distances or searching within a given area.

Hope this helps :slight_smile:


Thanks, I have seen a bit about that, does it work without an external API like Google etc?