首页 > 解决方案 > Rails 左外连接与包含 NULL 的行

问题描述

我需要做一个复杂的外部连接。service interval如果没有service_note与之相关的结果,我想在结果中排​​一排。正如您从查询中看到的,service_interval属于service_job通过联合表连接到 service_notes 的查询service_note_jobs。目前它返回一个空关系,如果没有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-railsrubypostgresqlactiverecord

解决方案


尝试在您的 left_joins 之后添加:

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

或更一般的样本

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

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


推荐阅读