【问题标题】:Sorting after a join based only on the filtered associations仅基于过滤的关联在连接后排序
【发布时间】:2018-08-18 03:25:58
【问题描述】:

我有一个包含许多时间槽的事件模型(从和到属性是日期时间)。

我正在根据事件是即将到来的、过去的还是当前的来过滤事件。

这是我的查询

Event.includes(:time_slots).by_upcoming.order("time_slots.from asc").distinct

假设我有两个即将到来的事件 - Event1(时间槽:昨天 12:00-13:00 和明天 12:00-13:00)和 Event2(时间槽:10:00-11:00 前两天和一天- 10:00-13:00后)

由于这些符合即将发生的事件,我需要将 Event1 列在 Event2 之前,因为 Event1(明天)的即将到来的时段发生在 Event2 的即将到来的时段(后天)之前

这些是我在 TimeSlot 模型中的作用域

scope :future, -> { where(from: DateTime.current..DateTime.current+20.years) }

在事件模型中

scope :by_upcoming, -> { where(id: TimeSlot.future.map(&:event_id)) }

但是,事件 2 列在事件 1 之前,因为最早的时间段是事件 2,即两天前。如何仅根据范围(by_upcoming)而不是所有时隙过滤掉的结果(时隙)进行排序?

【问题讨论】:

  • 也许只是 .reverse 到集合数组吗?
  • 不会的。以上两个只是例子。

标签: ruby ruby-on-rails-5


【解决方案1】:

您需要在 by_upcoming 范围内有一个额外的 where 条件,以将该查询限制为仅即将到来的 TimeSlot。

例如,可以这样做:

scope :by_upcoming, -> { where(id: TimeSlot.future.map(&:event_id)).where('time_slots.from > ?', DateTime.current) }

如果您不希望在未来范围内明确提及未来 20 年,则可以这样写:

scope :future, -> { where('time_slots.from > ?', DateTime.current) }

生成的SQL:

Event.by_upcoming.includes(:time_slots).order("time_slots.from asc").distinct

然后变成:

SELECT  DISTINCT "events"."id", time_slots.from AS alias_0
FROM "events"
LEFT OUTER JOIN "time_slots" ON "time_slots"."event_id" = "events"."id"
WHERE "events"."id" IN (1, 2)
AND (time_slots.from > '2018-08-18 11:40:44.785860')
ORDER BY time_slots.from asc

SELECT DISTINCT "events"."id" AS t0_r0, "events"."name" AS t0_r1, "events"."created_at" AS t0_r2, "events"."updated_at" AS t0_r3, "time_slots"."id" AS t1_r0, "time_slots"."from" AS t1_r1, "time_slots"."to" AS t1_r2, "time_slots"."event_id" AS t1_r3, "time_slots"."created_at" AS t1_r4, "time_slots"."updated_at" AS t1_r5
FROM "events"
LEFT OUTER JOIN "time_slots" ON "time_slots"."event_id" = "events"."id"
WHERE "events"."id" IN (1, 2) AND (time_slots.from > '2018-08-18 11:40:44.785860')
AND "events"."id" IN (1, 2)
ORDER BY time_slots.from asc

【讨论】:

  • 非常感谢。是的,20 年来我不需要明确的范围。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多