1

我最近偶然发现了这篇博文,其中指出 Array#uniq 在 ActiveRecord 对象数组上的行为不同,但没有给出具体的示例,也没有说明原因。

我希望看到这种不同行为的可重现示例及其解释。

编辑: 我说的是 Array#uniq,而不是 ActiveRecord::Relation#uniq。如果后者是上面提到的博客文章的实际含义,那么我的问题已经被 loz 回答了(见下文)。

4

1 回答 1

1

活动记录“数组”不是数组,它们是不同的。所以(除了.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 的内容

于 2013-01-09T08:10:58.370 回答