2012-09-06 7 views
7

tengo 2 relacionados modelos carrilesrieles combinación interna combinada con la gema geocodificación

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

class Rate < ActiveRecord::Base 
belongs_to :location 
end 

que estoy usando la gema geocodificador - http://www.rubygeocoder.com

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

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

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

Entonces, insertar un donde la condición que va a filtrar en el atributo de par, y luego utilizar el método cerca de la Geocoder en la tabla resultante (la cerca método funciona insertando una condición where en la consulta que calcula la distancia utilizando 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 los rieles? Probé

rates = Rate.joins(:locations) 

me sale

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 consigo

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

Puesto que es un belongs_to, creo que ': locations' tiene que ser singular. No estoy seguro de si esto funcionará, pero es posible que necesite reordenar un poco sus llamadas a los métodos. Depende de cómo funciona la gema con ARel. 'Rate.near (my_latitude, my_longitude, distance) .join (: location) .where (: rates => {: pair => 'xxxx'})' – agmcleod

Respuesta

2

Sé que esto es un viejo, pero todavía sin respuesta, en ninguna parte :)

Me encontré con el mismo problema, luego tropecé con una pequeña información deep down in the geocoder documentation, donde decía que para hacer que una combinación externa funcione (que en los raíles se hace con includes), debe usar join en combinación con: select y eso lo hizo por mí (necesitaba encontrar todos los productos de los usuarios dentro de una ubicación determinada).

Así que sólo desde la parte superior 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.

+0

Esta solución crea muchos problemas: no puede usar ámbitos, parciales no funciona porque Rails intenta mostrar la ubicación en lugar de tasas, etc. – collimarco

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

Esto es en cadena con otra ubicación o clasifique alcances

Cuestiones relacionadas