i’m trying to use the GeoKit plugin to calculate the distance between 2 points. So the idea is, i do a search for an article, and the results i want to order by distance. So i have a form where I enter the article (that im looking for) and my address. Then rails must find all articles that match with my query and order by address.
So now, i have two models: Article and User. Articles belongs_to User and User has_many Articles. At the User model i have the info related with my latitude and longitude.
So my Article object has three fields:
- id
- name
- user_id (FK to User model)
And my user model has four fields
- id
- name
- lat (latitude)
- lng (longitude)
OK, to have access to the user info thru articles i do the query:
@articles = Article.find(:all,:conditions=>'vectors @@ to_tsquery('büch')',:joins=>' INNER JOIN users ON users.id = articles.user_id',:include=>:user,:origin=>'Augustusplatz,8,leipzig,germany')
it works. But when i wanna add an :order=>’distance ASC’ it fails because the order by query is using a Article.lat, and Article.lng fields to calculate the distance, but these fields lat and lng, are User object’s members and not Article member.
BTW if I get the query generated by rails and i change the order by clause where uses articles.lat/lng to users.lat/lng it works.
I’m not really an SQL expert, and I find joins very hard to wrap my head around (even more than figuring out multiple NOT’s like
if(!(foo != !bar & (!baz)))) but I do feel that either the:joinsline or the:includeline is redundant, or even wrong.(I cleaned up your query so I could understand it, please do the same with the question):
I guess either the model of the user and article should define their relation, so you don’t need a manual join or that you remove the include.
But I don’t see from this code where the distance is actually calculated (probably some automagic in GeoKit?). The distance should be ‘named’ with the SQL someting like:
So you can refer to the distance in the order by clause, I don’t think the database cares if the ruby object doesn’t contain the value.
Perhaps if you showed us the generated SQL, wich causes errors, and you’r manipulated SQL we could understand better…