Может кто-нибудь кратко объяснить мне разницу в использовании между методами uniq
и distinct
?
Я видел, что оба используются в аналогичном контексте, но разница не совсем понятна мне.
Может кто-нибудь кратко объяснить мне разницу в использовании между методами uniq
и distinct
?
Я видел, что оба используются в аналогичном контексте, но разница не совсем понятна мне.
Запросы 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
В документации :
uniq(value = true)
Псевдоним для
ActiveRecord::QueryMethods#distinct
Это не совсем ответ на ваш вопрос, но я знаю:
Если мы рассмотрим контекст ActiveRecord, то uniq - это просто псевдоним для различных. И оба работают как удаление дубликатов в наборе результатов запроса (который можно сказать до одного уровня).
И в контексте массива uniq настолько мощен, что удаляет дубликаты, даже если элементы вложены. например
arr = [["first"], ["second"], ["first"]]
и если мы сделаем
arr.uniq
ответ будет: [["first"], ["second"]]
Таким образом, даже если элементы являются блоками, они углубляются и удаляют дубликаты.
Надеюсь, это поможет вам в некоторых отношениях.