我最近偶然发现了这篇博文,其中指出 Array#uniq 在 ActiveRecord 对象数组上的行为不同,但没有给出具体的示例,也没有说明原因。
我希望看到这种不同行为的可重现示例及其解释。
编辑: 我说的是 Array#uniq,而不是 ActiveRecord::Relation#uniq。如果后者是上面提到的博客文章的实际含义,那么我的问题已经被 loz 回答了(见下文)。
我最近偶然发现了这篇博文,其中指出 Array#uniq 在 ActiveRecord 对象数组上的行为不同,但没有给出具体的示例,也没有说明原因。
我希望看到这种不同行为的可重现示例及其解释。
编辑: 我说的是 Array#uniq,而不是 ActiveRecord::Relation#uniq。如果后者是上面提到的博客文章的实际含义,那么我的问题已经被 loz 回答了(见下文)。
活动记录“数组”不是数组,它们是不同的。所以(除了.all,它显式返回一个数组)如果你使用关联或类似的东西,你会得到不同的行为,因为延迟加载正在运行:
post = Post.find(1)
post.comments
=> Array[Comment(:1), Comment(:2)]... etc
看起来像一个数组,但是
post.comments.class
=> ActiveRecord::Relation
因此,执行 Uniq 会对关系进行操作,这会为查询添加更多约束,最终将在需要记录时在数据库上运行:
post.comments.uniq
这将通过在 SQL 中执行 DISTINCT 或 UNIQUE 查询子句来执行 uniq,而不是在 ruby 中执行 uniq。
uniq 详细信息可在此处找到:rails uniq 文档,您可以在此处查看活动记录中返回 ActiveRecord::Relation 的内容