【问题标题】:get all active record objects filtered for unique by one attribute获取按一个属性过滤为唯一的所有活动记录对象
【发布时间】:2016-01-19 15:45:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我有点迷茫,你想获取给定列的值在所有其他行中唯一的所有对象吗?
  • 我更新了问题:)

标签: ruby-on-rails activerecord


【解决方案1】:

你可以在id上使用minimum

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

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

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

【讨论】:

    【解决方案2】:

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

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

    Post.select('DISTINCT title')
    

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

    【讨论】:

    • 这将转换为Select DISTINCT title FROM Post。 OP 要求提供一组记录
    • 我已经编辑了我的答案。对于 OP 的要求,没有直接的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多