Направляющие, почему соединения возвращают массив со значениями non-uniq?

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

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

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

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 (: местоположения) .uniq, но я проиграл гибкий из ареала.

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

  1. Почему соединения возвращают не уникальный массив?
  2. Что, предпочитают использовать вместо соединений с этой целью?
5
задан petRUShka 4 July 2010 в 13:50
поделиться

1 ответ

Соединение по существу говорит о том, что нужно объединить две таблицы и рассматривать их как одну таблицу, отправляя обратно все, что будет найдено.Это означает, что он найдет вам каждую комбинацию города и местоположения (Rails помогает, сопоставляя вещи на основе отношения own_to / has_many в ваших моделях).

Выполнение City.joins (: locations) предназначено для поиска всех местоположений в городе. Другой способ ( Location.joins (: city) ) поможет определить, в каком городе находится локация.

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

16
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: