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 № 1near = 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.