2012-09-06 4 views
7

Ich habe 2 verwandte Schienen ModelleRails innere join mit Geokodierung gem kombiniert

class Location < ActiveRecord::Base 
    has_many :rates 
    geocoded_by .... 
end 

class Rate < ActiveRecord::Base 
belongs_to :location 
end 

ich den Geocoder gem bin mit - http://www.rubygeocoder.com

ich alle Raten mit einem bestimmten pair Attribut suchen, die innerhalb eines sind bestimmte Entfernung zum Benutzer.

In SQL, würde ich ein innere auf den Raten verbinden

SELECT * FROM rates INNER JOIN locations ON rates.location_id=locations.id; 

Dann legt eine in dem Zustand an dem Paar Attribute zu filtern, und dann den in der Nähe Methode des Geocoder verwendet auf der resultierende Tabelle (die in der Nähe von Methode funktioniert durch Einfügen einer Where-Bedingung in die Abfrage, die die Entfernung mit Längen-und Breitengrad Attribute vor Ort berechnet) nur die Zeilen innerhalb der richtigen Entfernung zu wählen

Wie kann ich dies in Schienen? Ich habe versucht,

rates = Rate.joins(:locations) 

I

bekommen
ActiveRecord::ConfigurationError: Association named 'locations' was not found; perhaps you misspelled it? 

ich diesen

rates = Rate.joins(:locations).near(my_latitude, my_longitude, distance).where(:rates => {:pair => 'xxxx'}) 

tun möchte, aber ich bekomme

undefined method `near' for #<ActiveRecord::Relation:0xa075ff8> 
+0

Da es ein belongs_to ist, ich denke, ': locations' singulär sein muss. Nicht sicher, ob das funktioniert, aber Sie müssen möglicherweise Ihre Methodenaufrufe einfach neu ordnen. Hängt davon ab, wie der Edelstein mit ARel funktioniert. 'Rate.near (my_latitude, my_longitude, distance) .join (: Speicherort) .where (: rates => {: pair => 'xxxx'})' – agmcleod

Antwort

2

Ich weiß, das eine alte, aber immer noch nicht beantwortet, nirgends :)

Ich stieß auf das gleiche Problem, stolperte dann auf ein wenig Info deep down in the geocoder documentation, wo es gesagt, dass, um eine äußere Join-Arbeit (die in Rails mit Includes gemacht wird), sollten Sie Join in Kombination mit: Wählen Sie und Das war es für mich (ich musste alle Produkte von Benutzern an einem bestimmten Ort finden).

Also nur aus der Spitze von meinem Kopf, könnte dies in Ihrem Fall:

rates = Location.near(my_latitude, my_longitude, distance, :select => "rates.*").joins(:locations).where(:rates => {:pair => 'xxxx'}) 

Ich hoffe, das hilft.

+0

Diese Lösung verursacht viele Probleme: Sie können keine Bereiche und Teilbereiche verwenden funktionieren nicht, weil Rails versucht, den Ort anstelle von Raten usw. zu rendern. – collimarco

7
near = Location.near(location, radius) 
Rate.includes(:location).references(:location).merge(near) 

Dies ist verkettbar mit anderem Ort oder Rate Tive