2010-07-04 7 views
5

Uso el ejemplo con Rails 3, pero creo que esto también se aplica a Rails 2.3.Rails, ¿por qué se une la matriz devuelve con valores no únicos?

Supongamos que tengo una ciudad modelo que tiene muchas ubicaciones. Intento encontrar ciudades que tengan ubicaciones.

I utilizar siguiente código:

City.joins(:locations) 

Pero matriz de salida es:

=> [#<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">, #<City id: 5, name: "moscow", created_at: "2010-07-02 15:09:16", updated_at: "2010-07-02 15:09:16">] 

longitud de la matriz es 4 (número de ubicaciones de Moscú).

¿En qué caso puede ser útil? ¿Para qué objetivos hay 4 copias de un objeto en output-array?

Puedo usar City.joins (: locations) .uniq, pero perdí agile of arel.

Tengo dos preguntas:

  1. Por qué une a los rendimientos de la matriz no singular?
  2. ¿Qué es preferible utilizar en lugar de uniones para este propósito?

Respuesta

16

Join dice esencialmente que se combinan dos tablas y se tratan como una sola tabla, devolviendo lo que se encuentre. Eso significa que encontrará todas las combinaciones de ciudad y ubicación (Rails está ayudando haciendo coincidir las cosas según la relación belongs_to/has_many en sus modelos).

Hacer City.joins(:locations) sería para encontrar todas las ubicaciones en una ciudad. Hacerlo a la inversa (Location.joins(:city)) sería para encontrar lo que la ciudad una ubicación se encuentra.

Ahora, sólo encontrar la lista de ciudades que tienen algunos lugares, puede intentar City.select(:city).joins(:locations).group('cities.id') La cláusula select() le dice que acaba de traer de vuelta la ciudad y la cláusula group() le dicen que no devuelva copias duplicadas.

+1

¡Gracias! grupo es lo que necesito! ¿Pero por qué Rails no quiere agruparse solo? El objeto de raíles de salida es una matriz de ciudades sin ninguna ubicación. Y en mi humilde opinión no hay casos de uso para tal salida. – petRUShka

+1

Gracias por la útil respuesta. Una pregunta: ¿City.x naturalmente no traería de vuelta a la ciudad sin la necesidad de la declaración seleccionada? –

+0

@edebill ¿hay alguna manera de omitir este 'grupo ('cities.id')' en cada consulta? – asiniy

Cuestiones relacionadas