/ / Unión interna de rieles combinada con gemas de geocodificación: rubí sobre rieles, geocodificación

Unión interna de rieles combinada con gema de geocodificación: rubí sobre rieles, geocodificación

Tengo 2 modelos de rieles relacionados

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

class Rate < ActiveRecord::Base
belongs_to :location
end

Estoy usando la gema del geocodificador http://www.rubygeocoder.com

Quiero encontrar todas las tarifas con un particular pair atributo que están dentro de una cierta distancia al usuario.

En SQL, haría una unión interna en las tasas

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

Luego, inserte una condición where para filtrar enempareje el atributo y luego use el método cercano del Geocodificador en la tabla resultante (el método cercano funciona insertando una condición where en la consulta que calcula la distancia usando los atributos de latitud y longitud en la ubicación) para seleccionar solo las filas dentro de la distancia correcta

¿Cómo puedo hacer esto en rieles? Lo intenté

rates = Rate.joins(:locations)

yo obtengo

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

quiero hacer esto

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

pero me sale

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

Respuestas

8 para la respuesta № 1
near = Location.near(location, radius)
Rate.includes(:location).references(:location).merge(near)

Esto se puede encadenar con otros ámbitos de ubicación o tasa


2 para la respuesta № 2

Sé que este es viejo, pero aún no respondió, en ninguna parte :)

Me encontré con el mismo problema, luego me topé con una pequeña información en el fondo de la documentación del geocodificador, donde dijo que para hacer un exteriorUnir trabajo (que en rails se hace con incluye), debe usar unir en combinación con: select y eso lo hizo por mí (necesitaba encontrar todos los productos de los usuarios dentro de una determinada ubicación).

Entonces, desde lo alto de mi cabeza, esto podría funcionar en su caso:

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

Espero que esto ayude.