【问题标题】:How do I find() all records unique in certain fields?如何查找()某些字段中唯一的所有记录?
【发布时间】:2009-03-16 16:34:53
【问题描述】:

我有一个“请求”对象的列表,每个对象都具有相当正常的活动记录质量。 requests 表通过连接表“games_requests”与游戏表相关联,因此请求具有 request.games 数组。

问题是,有没有办法查找最后 n 个唯一请求,其中唯一性由游戏列和其他几个列定义,但特别忽略其他列(如请求用户的名称?)

我看到了类似 'find (:all, :limit=>5, :include=>[:games,:stage])' 的语法,但它返回了重复项。

谢谢...

编辑:感谢混乱的伟大回应。你让我非常接近,但我仍然需要返回是有效的请求对象:在请求的行中不同的前 5 条记录。我可以在你构造它时使用 find,然后对表中与第一个 find 返回的每个集合匹配的第一行进行第二个 find。

编辑:

Games.find(
    :all, :limit => 5,
    :include => [:games, :requests],
    :group => 'games, whatever, whatever_else'
)

...给出一个 SQL 错误:

Mysql::Error: Unknown column 'games' in 'group statement': SELECT * FROM `games`  GROUP BY games

我对我认为对我的项目正确的内容进行了一些更改;获取请求列表而不是游戏等:

Request.find(
    :all, :order=>"id DESC", :limit=>5,
    :include=>[:games],   #including requests here generates an sql error
    :group=>'games, etc'  #mysql error:  games isn't an attribute of requests
    :conditions=>'etc'
)

我想我必须在这里使用 :join=> 选项。

【问题讨论】:

    标签: ruby-on-rails activerecord find unique distinct


    【解决方案1】:
    Games.find(
        :all, :limit => 5,
        :include => [:games, :requests],
        :group => 'games, whatever, whatever_else'
    )
    

    【讨论】:

    • 这将返回 games、whatever 和 whatever_else 列。有没有办法返回完整的请求对象,只弹出这些列中唯一性失败的对象?
    • 人力资源部。通过连接表将“游戏”作为虚拟属性存在问题。 (见编辑过的问题)
    • 在不知道您的实际表结构的情况下编写可以工作的东西真的很难。可能 :group => 'games' 应该是 :group => 'game_id' 因为那是请求中列的名称?
    • 哦,对了,你有一个多对多。是的,你需要一个 :join 规范来引入你的 games_requests 表,然后在其中对 game_id 列进行分组。
    【解决方案2】:

    试试 Rails uniq_by。它也适用于关联并返回数组。

    @document = Model.uniq_by(&:field)

    更多Detail

    【讨论】:

    • 认为uniq_by 已贬值并被uniq 取代。
    【解决方案3】:

    我认为您可以使用 find_by_sql 和 GROUP BY 来做到这一点:

    Games.find_by_sql("SELECT * FROM games GROUP BY user_id")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多