Array#uniq用于ActiveRecord对象的数组

时间:2013-01-09 07:49:53

标签: ruby activerecord

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

我希望看到一个可重复的例子,说明不同的行为及其解释。

修改 我在谈论Array#uniq,而不是ActiveRecord :: Relation #uniq。如果后者是上述博客文章的实际含义,那么我的问题已经被loz回答了(见下文)。

1 个答案:

答案 0 :(得分: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 documentation,您可以在active record here

中查看返回ActiveRecord :: Relation的内容