Rails, почему объединения возвращают массив с неуникальными значениями? - PullRequest
5 голосов
/ 04 июля 2010

Я использую пример с Rails 3, но я считаю, что это верно и для Rails 2.3.

Предположим, у меня есть модель City, которая имеет много локаций. Я пытаюсь найти города, которые имеют местоположения.

Я использую следующий код:

City.joins(:locations)

Но выходной массив:

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

Длина массива - 4 (количество населенных пунктов Москвы).

В каком случае это может быть полезно? Для каких целей в выходном массиве 4 копии одного объекта?

Я могу использовать City.joins (: location) .uniq, но я потерял ловкость арела.

У меня два вопроса:

  1. Почему объединения возвращают не уникальный массив?
  2. Что предпочитаете использовать для соединений вместо соединений?

1 Ответ

16 голосов
/ 04 июля 2010

Join, по сути, говорит, что объединяет две таблицы и обрабатывает их как одну таблицу, отправляя обратно все, что будет найдено.Это означает, что он найдет вам любую комбинацию города и местоположения (Rails выручает, сопоставляя вещи, основываясь на соотношенииочных отношениях в ваших моделях).в городе.Делать это другим способом (Location.joins(:city)) можно было бы для поиска города, в котором находится локация.

Теперь, чтобы просто найти список городов, в которых есть местоположения, вы можете попробовать City.select(:city).joins(:locations).group('cities.id') The * 1008.* В предложении говорится, что нужно просто вернуть Город, а в предложении group () запрещается возвращать дубликаты.

...