Rails:uniq vs. distinct

Mat*_*ias 29 activerecord ruby-on-rails

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

我已经看到两者都在类似的背景下使用,但差异对我来说并不十分清楚.

its*_*lay 60

导轨查询像阵列的行为,从而.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)
Run Code Online (Sandbox Code Playgroud)

这对于制作高性能应用程序非常有用

提示:

同样适用于

  • .sizevs .count;
  • present? VS .exists?
  • pluck VS map

  • 感谢您的回答。我有一个问题:它不取决于数据库返回的行数吗?如果您有大量结果而不是少量行,那么数据库的性能可能会比 ruby​​ 更好? (2认同)
  • @GLaDOS是的,*rails应用程序就像一座建筑物*:在一楼我们有sql,在二楼和其他楼我们有业务逻辑,在最后一层我们有用户视图。1)如果用户不需要任何数据,我们不应该将数据从第一层提升到最后一层。所以这意味着我们不应该在sql层获取数据,也不应该在rails层上提取数据(所以使用`.limit(25)`方法而不是`.first(25)`)。2)另外,以防万一我们错过了一楼的任何数据。跑回一楼从sql中获取额外的数据效率不高。因此在这种情况下请使用“.includes(:comments)”。ETC (2认同)

小智 7

Rails 5.1 已从 Activerecord Relation 中删除了 uniq 方法并添加了 unique 方法...

  • 如果您将 uniq 与查询一起使用,它只会将 Activerecord Relation 转换为 Array 类...
  • 如果你在那里添加了 uniq,你就不能有查询链....(即你不能做 User.active.uniq.subscribed ,它会抛出错误undefined method subscribed for Array
  • 如果您的数据库很大并且您只想获取所需的不同条目,那么最好将不同的方法与 Activerecord 关系查询一起使用...


Зел*_*ный 5

文档:

uniq(value = true)

别名ActiveRecord::QueryMethods#distinct

  • apidock.com 不是 Rails 文档,并且不再维护。更好的来源是 https://api.rubyonrails.org (3认同)