2010-07-04 15 views
5

Używam przykładu z Railsami 3, ale uważam, że dotyczy to również Rails 2.3.Railsy, ​​dlaczego łączenia zwraca tablicę z wartościami innymi niż uniq?

Załóżmy, że mam model City, który ma wiele lokalizacji. Próbuję znaleźć Miasta, które mają lokalizacje.

używam następujący kod:

City.joins(:locations) 

Ale tablica wyjściowa jest:

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

długość tablicy wynosi 4 (liczba miejsc w Moskwie).

W jakim przypadku może być przydatny? Dla jakich celów są 4 kopie jednego obiektu w tablicy wyjściowej?

Mogę używać City.joins (: lokalizacje) .uniq, ale straciłem zwinność arel.

Mam dwa pytania:

  1. Dlaczego zarejestrowała się powroty non unikalny wachlarz?
  2. Jakie jest preferowane użycie zamiast złączeń w tym celu?

Odpowiedz

16

Dołącz zasadniczo mówi, że łączy dwie tabele i traktuje je jak jeden stół, odsyłając wszystko, co można znaleźć. To oznacza, że ​​znajdziesz każdą kombinację miasta i lokalizacji (Rails pomaga, dopasowując rzeczy do swoich potrzeb w oparciu o relacje belongs_to/has_many).

Doing City.joins(:locations) będzie za znalezienie wszystkich lokalizacji w mieście. Robi to w inny sposób (Location.joins(:city)) byłoby znalezienie tego miasta lokalizacja jest.

Teraz, aby tylko znaleźć listę miast, które mają pewne lokalizacje, możesz spróbować City.select(:city).joins(:locations).group('cities.id') Klauzula select() mówi to po prostu przywrócić Miasto i klauzula group() mówi, aby nie zwracać duplikatów.

+1

Dziękujemy! grupa jest tym, czego potrzebuję! Ale dlaczego szyny nie chcą grupować samodzielnie? Obiekt szyn wyjściowych to tablica miast bez żadnych lokalizacji. I IMHO nie ma przypadków użycia dla takiego wyjścia. – petRUShka

+1

Dzięki za pomocną odpowiedź. Jedno pytanie - czy City.x naturalnie nie przywróci miasta bez potrzeby wybierania oświadczenia? –

+0

@edebill jest jakiś sposób na pominięcie tej 'group ('cities.id')' na każdym zapytaniu? – asiniy

Powiązane problemy