【问题标题】:Rails left outer join with row including NULLRails 左外连接与包含 NULL 的行
【发布时间】:2020-02-08 09:41:35
【问题描述】:

我需要做一个复杂的外连接。如果没有与之连接的service_note,我想在service interval 的结果中显示一行。从查询中可以看到service_interval 属于一个service_job,它通过联合表service_note_jobs 连接到service_notes。目前,如果没有service_note 连接到该service_interval,它将返回一个空关系。

def self.distance_and_time_until_next_service(service_interval_ids)
  ServiceInterval
    .left_joins(vehicle: { service_notes: :service_note_jobs })
    .where(
      'service_note_jobs.service_job_id = service_intervals.service_job_id AND '\
      'service_intervals.vehicle_id = service_notes.vehicle_id'
    )
    .where(service_intervals: { id: service_interval_ids })
    .group('service_intervals.id')
    .select(
      'service_intervals.id',
      "MAX(GREATEST(service_notes.odometer, service_intervals.created_odometer) - vehicles.odometer + service_intervals.distance_interval) AS distance_left_until_next_service",
      "MAX(ROUND(EXTRACT(epoch FROM(GREATEST(service_notes.date, service_intervals.created_at) - NOW())) / 86400  + service_intervals.time_interval)) AS time_left_until_next_service"
    )
end

【问题讨论】:

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

尝试在你的 left_joins 之后添加这个:

.where(vehicle: { service_notes: { id: nil } })

或更一般的示例

User.left_joins(:posts).where(posts: { id: nil })

这将为您提供没有帖子的用户。

【讨论】:

  • 这不会过滤掉带有服务说明的那些吗?
  • 是的,你是对的。它将过滤掉带有 service_notes 的记录。没有它们,你只会得到那些。
  • 是的,这就是问题所在,它还应该保留那些没有服务说明的。我刚刚意识到 COALESCE 可能会起作用。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多