2010-07-04 9 views
5

Io uso un esempio con Rails 3, ma credo che questo sia vero anche per Rails 2.3.Rails, perché joins restituisce array con valori non uniq?

Supponiamo, ho Città modello che ha molte posizioni. Cerco di trovare le città che hanno posizioni.

Io uso seguente codice:

City.joins(:locations) 

Ma array di uscita è:

=> [#<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">] 

Lunghezza campo è 4 (numero di locazioni di Moscow).

In quale caso può essere utile? Per quali scopi sono 4 copie di un oggetto in output-array?

Posso usare City.joins (: locations) .uniq, ma ho perso agile di Arel.

Ho due domande:

  1. Perché join Restituisce Array non unico?
  2. Che cosa si preferisce utilizzare al posto di join per questo scopo?

risposta

16

Unire essenzialmente dice di combinare due tabelle e trattarle come una tabella, rimandando ciò che si sarebbe trovato. Ciò significa che ti troverà ogni combinazione di città e ubicazione (Rails ti aiuta facendo corrispondere le cose in base al rapporto belong_to/has_many nei tuoi modelli).

Fare City.joins(:locations) sarebbe per trovare tutte le posizioni in una città. Facendo il contrario (Location.joins(:city)) sarebbe per trovare quale città una posizione è in.

Ora, per trovare solo l'elenco delle città che hanno alcune località, si potrebbe provare City.select(:city).joins(:locations).group('cities.id') La clausola select() dice di portare solo indietro la City e la clausola group() gli dice di non riportare copie duplicate.

+1

Grazie! gruppo è quello che mi serve! Ma perché le rotaie non vogliono raggruppare da sole? L'oggetto Rails di output è una matrice di città senza posizioni. E IMHO non ci sono casi d'uso per tale output. – petRUShka

+1

Grazie per la risposta utile. Una domanda: City.x non restituirebbe naturalmente la città senza la necessità dell'istruzione selezionata? –

+0

@edebill c'è un modo per omettere questo 'gruppo ('cities.id')' su ogni query? – asiniy

Problemi correlati