有人可以简单地向我解释方法uniq
和distinct
之间的使用差异吗?
我已经看到两者都在类似的背景下使用,但差异并不是很清楚。
答案 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)
<{3}} 的
uniq(value = true)
别名
答案 2 :(得分:2)
它不完全回答你的问题,但我所知道的是:
如果我们考虑ActiveRecord上下文,那么 uniq 只是 distinct 的别名。它们都可以在查询结果集上删除重复项(最多可以说是一个级别)。
在数组上下文中,uniq非常强大,即使元素嵌套也会删除重复项。例如
arr = [["first"], ["second"], ["first"]]
如果我们这样做
arr.uniq
答案将是:[["first"], ["second"]]
因此,即使元素是块,它也会深入并删除重复项。
希望它能在某些方面帮助你。
答案 3 :(得分:2)
Rails 5.1从Activerecord Relation中删除了uniq方法,并添加了与众不同的方法...
undefined method subscribed for Array
)