【问题标题】:Rails Active Record scope to group objects and return object with lowest dateRails Active Record 范围对对象进行分组并返回具有最低日期的对象
【发布时间】:2017-02-11 19:29:45
【问题描述】:

我想向我的事件模型添加一个范围,按列对我的事件进行分组,然后返回最早日期的事件。这是我正在尝试的方法,但出现错误。

scope :closest, -> {
    group(:some_column).having('date = MIN(date)')
 }

Event.closest ==> 应该从每个父母那里返回最早的子事件。以下是错误:

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column “events.id”必须出现在 GROUP BY 子句中或用于 聚合函数

【问题讨论】:

  • 如果两条记录的日期相同,即所有记录的最小日期怎么办。那么您期望多条记录对吗?
  • 嗯,它实际上是日期时间,所以两条相同的记录不太可能出现,但理论上,如果它们相同,那么我希望有两条。但这不是这里发生的事情。
  • @Dinesh 实际上在控制台中看到一条错误消息(已编辑答案)

标签: ruby-on-rails activerecord


【解决方案1】:

我最终使用了:

  scope :closest, -> {
    where(id: Event.group(:parent_id).minimum(:date).keys)
  }

【讨论】:

  • 你确定你想要这样的东西吗?您按 parent_id 分组,然后查询 id = parent_ids 的位置。您每次都只想要父记录吗?
  • 我觉得有些混乱,抱歉。每个孩子和每个父母都会有一个 parent_id。所以 event_one 可能有 id = 1 和 parent_id = 1 (本身)。 event_two 可能有 id = 2 和 parent_id = 1。所以我试图按所有父母分组,然后以最短日期获取孩子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2016-05-14
  • 1970-01-01
  • 2015-07-02
  • 2021-09-25
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多