Rails: выберите уникальные значения из столбца

У меня уже есть рабочее решение, но мне очень хотелось бы знать, почему это не работает:

ratings = Model.select(:rating).uniq ratings.each { |r| puts r.rating } 

Он выбирает, но не печатает уникальные значения, он печатает все значения, включая дубликаты. И это в документации: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

 Model.select(:rating) 

Результатом этого является коллекция объектов Model . Не простые оценки. И, с точки зрения uniq , они совершенно разные. Вы можете использовать это:

 Model.select(:rating).map(&:rating).uniq 

или это (наиболее эффективное)

 Model.uniq.pluck(:rating) # rails 5+ Model.distinct.pluck(:rating) 

Обновить

По-видимому, с рельсов 5.0.0.1 он работает только на запросы «верхнего уровня», как указано выше. Не работает на сборные прокси (например, отношения «has_many»).

 Address.distinct.pluck(:city) # => ['Moscow'] user.addresses.distinct.pluck(:city) # => ['Moscow', 'Moscow', 'Moscow'] 

В этом случае дедупликация после запроса

 user.addresses.pluck(:city).uniq # => ['Moscow'] 

Если вы собираетесь использовать Model.select , тогда вы можете просто использовать DISTINCT , так как он вернет только уникальные значения. Это лучше, потому что это означает, что он возвращает меньше строк и должен быть немного быстрее, чем возвращать несколько строк, а затем указывать Rails для выбора уникальных значений.

 Model.select('DISTINCT rating') 

Конечно, это обеспечивается тем, что ваша firebase database понимает ключевое слово DISTINCT , и большинство должно.

Это тоже работает.

 Model.pluck("DISTINCT rating") 
 Model.uniq.pluck(:rating) # SELECT DISTINCT "models"."rating" FROM "models" 

Это имеет преимущества не использования строк sql, а не экземпляров моделей

 Model.select(:rating).uniq 

Этот код работает как «DISTINCT» (не как Array # uniq), поскольку rails 3.2

Если вы хотите также выбрать дополнительные поля:

 Model.select('DISTINCT ON (models.ratings) models.ratings, models.id').map { |m| [m.id, m.ratings] } 

Если кто-то ищет то же самое с Монгоидом, то есть

 Model.distinct(:rating) 

Если я иду прямо в путь, тогда:

Текущий запрос

 Model.select(:rating) 

возвращает массив объекта, и вы написали запрос

 Model.select(:rating).uniq 

uniq применяется к массиву объекта, и каждый объект имеет уникальный идентификатор. uniq выполняет свое задание правильно, потому что каждый объект в массиве является uniq.

Есть много способов выбрать отличный рейтинг:

 Model.select('distinct rating').map(&:rating) 

или

 Model.select('distinct rating').collect(&:rating) 

или

 Model.select(:rating).map(&:rating).uniq 

или

 Model.select(:name).collect(&:rating).uniq 

Еще одно, первый и второй запрос: найти различные данные по SQL-запросу.

Эти запросы будут рассматриваться как «лондон» и «лондон», то есть они будут игнорировать пространство, поэтому он будет выбирать «лондон» один раз в вашем запросе.

Третий и четвертый запрос:

найти данные по SQL-запросу и для отдельных данных, применяемых ruby ​​uniq mehtod. эти запросы будут считаться «лондон» и «лондон» разными, поэтому он будет выбирать «лондон» и «лондон» как в вашем результате запроса.

пожалуйста, предпочитайте прикрепленное изображение для более глубокого понимания и взгляните на «Toured / Awaiting RFP».

введите описание изображения здесь

В некоторых ответах не учитывается, что OP хочет массив значений

Другие ответы не работают хорошо, если ваша модель имеет тысячи записей

Тем не менее, я считаю, что хороший ответ:

  Model.uniq.select(:ratings).map(&:ratings) => "SELECT DISTINCT ratings FROM `models` " 

Потому что, сначала вы создаете массив модели (с уменьшенным размером из-за выбора), тогда вы извлекаете единственный атрибут, который у выбранных моделей есть (рейтинги)

 Model.select(:rating).distinct 

Другой способ сбора столбцов uniq с помощью sql:

 Model.group(:rating).pluck(:rating) 
Interesting Posts

Bash расширяет переменную переменной

Как настроить log4j только для хранения файлов журнала за последние семь дней?

Отключить масштабирование экрана в Xvesa?

Как я могу служить PDF в браузере, не сохраняя файл на стороне сервера?

MySQL – как разбирать строковое значение в формате DATETIME внутри инструкции INSERT?

Как использовать двухдиапазонную карту Wi-Fi для одновременного подключения к 5 ГГц и 2,4 ГГц в Windows?

Не удается увидеть пользователя коммутатора в Windows 8

Использование OpenGl с C #?

Почему C # ограничивает набор типов, которые могут быть объявлены как const?

После создания TensorFlow из источника, видя ошибки libcudart.so и libcudnn

В чем разница между JoinQueryOver и JoinAlias?

В eclipse не удалось ссылаться на проект библиотеки Android в другом проекте Android

Как пользователи / разработчики могут установить конфигурацию прокси-сервера Android для версий 2.x?

При обработке отчета произошла ошибка. Отчеты -RLDC в ASP.NET MVC

Формат даты Java для локали

Давайте будем гением компьютера.