获取通过一个属性

时间:2016-01-19 15:45:30

标签: ruby-on-rails activerecord

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

我应该对此进行限定,取得第一个独特记录并忽略其余记录。

我通常的方法是查询对象并拔出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

我想完整性。让我们说这是一个包含多列的直通表。我怎样才能通过两列或更多列获得唯一记录?

2 个答案:

答案 0 :(得分:4)

您可以在ID:

上使用minimum
Test.group(:test_id).minimum(:id)

这些将返回带有组键和id值的哈希值,您可以将其传递给范围上的where条件:

Test.where(id: (Test.group(:test_id).minimum(:id).values))

答案 1 :(得分:1)

是。您可以使用distinct基于列的唯一性过滤结果。

考虑一下Post模型带有title列,您必须按标题获取唯一记录,然后才能执行

Post.select('DISTINCT title')

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