Rails: uniq vs.

Может кто-нибудь кратко объяснить мне разницу в использовании между методами uniq и distinct?

Я видел, что оба используются в аналогичном контексте, но разница не совсем понятна мне.

Ответ 1

Запросы Rails действуют как массивы, поэтому .uniq дает тот же результат, что и .distinct, но

  • .distinct - метод запроса SQL
  • .uniq - метод массива

Примечание: в Rails 5+ Relation#uniq устарела и рекомендуется вместо этого использовать Relation#distinct Different. Смотрите http://edgeguides.rubyonrails.org/5_0_release_notes.html#active-record-deprecations

Подсказка:

Использование .includes перед вызовом .uniq/.distinct может замедлить или ускорить ваше приложение, потому что

  • uniq не будет вызывать дополнительный SQL-запрос
  • distinct будет делать

Но оба результата будут одинаковыми

Пример:

users = User.includes(:posts)
puts users
# First sql query for includes

users.uniq
# No sql query! (here you speed up you app)
users.distinct
# Second distinct sql query! (here you slow down your app)

Это может быть полезно для создания приложения

Подсказка:

То же самое работает для

  • .size vs .count;
  • present? против. .exists?
  • pluck против map

Ответ 3

Это не совсем ответ на ваш вопрос, но я знаю:

Если мы рассмотрим контекст ActiveRecord, то uniq - это просто псевдоним для различных. И оба работают как удаление дубликатов в наборе результатов запроса (который можно сказать до одного уровня).

И в контексте массива uniq настолько мощен, что удаляет дубликаты, даже если элементы вложены. например

arr = [["first"], ["second"], ["first"]]

и если мы сделаем

arr.uniq

ответ будет: [["first"], ["second"]]

Таким образом, даже если элементы являются блоками, они углубляются и удаляют дубликаты.

Надеюсь, это поможет вам в некоторых отношениях.