Rails:uniq vs. distinct

时间:2016-09-19 14:16:32

标签: ruby-on-rails activerecord

有人可以简单地向我解释方法uniqdistinct之间的使用差异吗?

我已经看到两者都在类似的背景下使用,但差异并不是很清楚。

4 个答案:

答案 0 :(得分:43)

Rails查询就像数组一样,因此.uniq会产生与.distinct相同的结果,但是

  • .distinct是SQL查询方法
  • .uniq是数组方法

注意:在Rails 5+中Relation#uniq已弃用,建议改为使用Relation#distinct。 见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? vs .exists?
  • pluck vs map

答案 1 :(得分:3)

来自documentation

  

uniq(value = true)

     <{3}}

别名

答案 2 :(得分:2)

它不完全回答你的问题,但我所知道的是:

如果我们考虑ActiveRecord上下文,那么 uniq 只是 distinct 的别名。它们都可以在查询结果集上删除重复项(最多可以说是一个级别)。

数组上下文中,uniq非常强大,即使元素嵌套也会删除重复项。例如

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

如果我们这样做

arr.uniq
答案将是:[["first"], ["second"]]

因此,即使元素是块,它也会深入并删除重复项。

希望它能在某些方面帮助你。

答案 3 :(得分:2)

Rails 5.1从Activerecord Relation中删除了uniq方法,并添加了与众不同的方法...

  • 如果对查询使用uniq,它将仅将Activerecord Relaction转换为Array类...
  • 如果在其中添加了uniq,就不会有查询链...。(即,如果您无法执行User.active.uniq.subscribed,则会抛出错误undefined method subscribed for Array
  • 如果您的数据库很大,并且您只想获取所需的不同条目,则可以在Activerecord Relation查询中使用不同的方法...