【问题标题】:How to select unique values from a single column, with a default scope, returning multiple columns如何从具有默认范围的单个列中选择唯一值,返回多列
【发布时间】:2014-10-06 15:40:24
【问题描述】:

在 Rails 应用程序中,我需要返回一个包含多列的 ActiveRecord 集合,但只有一列必须是唯一的。有一个默认范围不是唯一值。

默认范围

default_scope { order('executed_at DESC') }

当前查询没有唯一的 :terms。

Search.where(organization_id: @my_array_of_ids)
      .executed_after(from_date_time)
      .limit(100)
      .pluck(:terms)

executed_after(from_date_time) 也是一个范围。如何在不使用 .uniq 方法的情况下更改上述查询以返回唯一术语?我希望这是一条 SQL 语句。

【问题讨论】:

标签: sql ruby-on-rails postgresql arel


【解决方案1】:

我还发现了这个:

Convert SQL query to Active Record query in Rails 4

注意 Model.distinct(:column)

编辑:

我猜是这样的,但我需要更多信息:

Search.distinct(:terms).select(:executed_at)
.where(organization_id: @my_array_of_ids)
  .executed_after(from_date_time)
  .limit(100)
  .group(:executed_at)

【讨论】:

  • 这给了我错误PG::GroupingError: ERROR: column "searches.executed_at" must appear in the GROUP BY clause or be used in an aggregate function 我认为它与默认范围有关
  • 那是SQL错误,需要将列添加到group by子句中.group(:executed_at)
  • 我试过了,问题是 execute_at 是一个带有所有唯一结果的时间戳。我不在乎这些是否独一无二;仅当条款是唯一的。
  • 但是 execute_at 列在 select 子句中,对吗?如果它在 select 子句中,尽管它不是不同的参数之一,但它必须在 group by 子句中,因为它都是唯一的,它不会对任何记录进行分组。
  • 我相信默认范围使其成为 select 子句的一部分。 SELECT terms, executed_at GROUP BY terms, executed_at 将返回所有结果,因为执行时间是时间戳。我需要解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2023-03-30
  • 2019-11-06
  • 2023-03-31
  • 1970-01-01
  • 2011-08-30
  • 2015-08-02
相关资源
最近更新 更多