ActiveRecord,查找关联记录不存在或状态为零的所有记录

ActiveRecord, find all records where associated record EITHER does not exist OR exists with nil status

3 件事: - 物流 has_many RentalRequests through Type_Logistic 协会 table。 - Logistic 不必存在 RentalRequest(即不存在 Type_Logistic 关联) - RentalRequest 有一个 status_id

我想找到所有物流记录,其中要么没有关联的 RentalRequests,要么关联的 RentalRequest 的 status_id 为零。我目前的解决方案是多步骤的:

assoc_RR_has_nil_status = Logistic.includes(:rental_requests).where(rental_requests: {status_id: nil}).pluck(:id)
no_assoc_RR = Logistic.includes(:rental_requests).where(rental_requests: {id:nil}).pluck(:id)
inc_logistics_ids = assoc_RR_has_nil_status | no_assoc_RR
@Incomplete_logistics = Logistic.find(inc_logistics_ids.sort)

但我想知道是否有一种方法可以在单个 where 或链中执行此操作。

谢谢!

编辑!更新了我上面的代码,因为原来的 merge 表示 AND 而不是 OR。

不要害怕使用 SQL。这是一个很棒的工具!

Logistic.
  joins("LEFT OUTER JOIN type_logistics ON type_logistics.logistic_id = logistics.id").
  joins("LEFT OUTER JOIN rental_requests ON type_logistics.rental_request_id = rental_requests.id").
  where("rental_requests.id IS NULL OR rental_requests.status_id IS NULL")

如果必须避免SQL:

仅使用 Ruby 代码(没有 SQL 片段)就可以生成与上述相同的查询。例如,您可以使用 ARel,如 SO discussion.

中所建议的那样

A​​Rel 非常适合在高抽象层次上构建查询。对于我遇到的大多数情况,使用 SQL 片段比使用 ARel 简单得多。选择最适合您的用例的那个。