2012-04-13 3 views
0

In meinem Fall habe ich ein Modell Produkt has_one LocationWie Verwenden von Bereich in AR-Anforderung mit Joins?

Ich verwende einen Geocoder Edelstein, um die Position in der Nähe einer Entfernung zu suchen.

Der Antrag Location.near ([0, 0], 100) ist wie folgt aussehen:.

SELECT Stellen *, 6371,0 * 2 * ASIN (SQRT (POWER (SIN ((0 - Standorte .Lautheit) * PI()/180/2), 2) + COS (0 * PI()/180) * COS (Standorte.Länder * PI()/180) * POWER (SIN ((1 - Standorte.Langl) * PI()/180/2), 2))) AS Abstand, CAST (GRAD (ATAN2 (RADIANS (Länge - 1), RADIANS (Breite - 0))) + 360 AS Dezimal)% 360 AS Lager FROM \ "locations \" WO (6371.0 * 2 * ASIN (SQRT (LEISTUNG (SIN ((0 - locations.latitude) * PI()/180/2), 2) + COS (0 * PI()/180) * COS (locations.latitude * PI()/180) * POWER (SIN ((1 - locations.longitude) * PI()/180/2), 2))) < = 20) ORDER BY Abstand

Ich möchte so etwas wie dies zu tun:

Product.where(...).joins(:location).dosomething 

Wie kann ich es tun?

Antwort

0

Location#near ist ein benannter Bereich? Wenn dies der Fall ist, können Sie es mit Ihrem Scope unter Verwendung des & Operators zusammenführen. Ich denke, das sollte funktionieren:

class Product 
    scope :near, lambda { |coord, dist| joins(:location) & Location.near(coord, dist) } 

    ... 
end 

Dann können Sie es einfach verwenden, etwa so:

Product.near([0, 0], 100) 
+0

Ja Es ist ein Bereich. Ich habe es versucht und habe 3 Anfragen: Vorschlag Laden (5442.1ms) SELECT "Vorschläge". * Von "Vorschläge" INNER JOIN "Standorte" ON "Standorte". "Locable_id" = "Vorschläge". "ID" UND "Standorte ". locationable_type" = 'Vorschlag' Standort laden (186.6ms) SELECT-Standorte. *, 6371.0 * 2 * ASIN (SQRT (LEISTUNG (SIN ((0 - locations.latitude) ... Vorschlag laden (4920.5ms) SELECT "Vorschläge". * FROM "Vorschläge" –

+0

Was ist Vorschlag? Und können Sie den Code für "Location # in der Nähe" zeigen? – tsherif

+0

Vorschlag == Produkt. Location # in der Nähe => https://github.com/alexreisner/geocoder /blob/master/lib/geocoder/stores/active_record.rb#L34 –

0

Eine andere Möglichkeit, da die Bereiche Verschmelzung nicht zu funktionieren scheint:

class Product 
    scope :near, lambda { |coord, dist| where(:id => Location.near(coord, dist).all.map(&:locationable_id) } 

    ... 
end 

Und Verwendung wie in der anderen Antwort:

Product.near([0, 0], 100) 
+0

Entschuldigung Diese Lösung ist nicht für die Produktion –