【问题标题】:Distinct query in has_many relationship with ActiveRecord与 ActiveRecord 的 has_many 关系中的不同查询
【发布时间】:2020-04-12 18:54:10
【问题描述】:

无法找出处理此类查询的最有效方法。

我有 3 个模型:

UserLocationQuery

# User
has_many :queries

# Query
belongs_to: :user
belongs_to :location

我将user.queries 用于统计信息,因为它包含额外的元数据,如果它们碰巧执行相同的查询,location_id 列上有很多重复项,但每个都有不同的元数据,因此它被记录为单独的记录。

我想构建一个所谓的history,它从User.queries 中选择最近不同的location_id,并按idcreated_at 的顺序返回它们,同时仍将其保留为ActiveRecord 集合和不将其转换为数组,以便对其进行迭代以进行渲染。

user.queries.select(:location_id).distinct 已接近但未排序。

以下原始 SQL 似乎正在工作,但有没有办法用 ActiveRecord 编写它

queries.find_by_sql("
      SELECT location_id, created_at
      FROM (SELECT DISTINCT ON (queries.location_id) *
        FROM queries
        ORDER BY queries.location_id, queries.created_at DESC) queries
      ORDER BY queries.created_at DESC
      LIMIT 20
    ")

【问题讨论】:

    标签: ruby-on-rails ruby postgresql


    【解决方案1】:

    uniq 会尽可能接近

    user.queries.order('queries.created_at DESC').pluck(:location_id).uniq
    user.queries.select("location_id, queries.created_at").map(&:location_id).uniq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多