获取所有活动记录对象过滤为唯一的一个属性

ise*_*sea 4 activerecord ruby-on-rails

是否可以查询模型对象并按一列或多列过滤结果以获得唯一性?

我应该用第一个独特的记录来证明这一点,而忽略其余的记录就可以了。

我通常的方法是查询对象并提取 uniq id 或其他任何内容并运行另一个查询。

假设我有一个这样的集合:

测试 id:24997,test_id:7,group_id:5408,

测试 id:25001,test_id:7,group_id:5412,

测试id:25002,test_id:8,group_id:5413,

测试 id:25004,test_id:8,group_id:5415,

测试id:25007,test_id:9,group_id:5417,

测试 id:25008,test_id:9,group_id:5299

我想要这样的结果。由 test_id 列唯一:

测试 id:24997,test_id:7,group_id:5408,

测试id:25002,test_id:8,group_id:5413,

测试 id:25007,test_id:9,group_id:5417

我想是为了完整性。假设这是一个具有多列的直通表。如何获得两列或更多列的唯一记录?

小智 5

您可以在 id 上使用minimum

Test.group(:test_id).minimum(:id)
Run Code Online (Sandbox Code Playgroud)

这些将返回一个带有组键和 id 值的散列,您可以将其传递给作用域上的 where 条件:

Test.where(id: (Test.group(:test_id).minimum(:id).values))
Run Code Online (Sandbox Code Playgroud)


avi*_*oth 3

是的。您可以使用unique来根据列的唯一性来过滤结果。

考虑您有一个Post带有列的模型title,并且您必须按标题获取唯一记录,那么您会这样做

Post.select('DISTINCT title')
Run Code Online (Sandbox Code Playgroud)

编辑:上面的查询只会返回标题列,但如果您想要所有列,则必须循环和过滤。基本上,如果您对一列执行唯一性并且存在重复项,则它无法决定保留哪一列以及丢弃哪一列。