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.
中所建议的那样
ARel 非常适合在高抽象层次上构建查询。对于我遇到的大多数情况,使用 SQL 片段比使用 ARel 简单得多。选择最适合您的用例的那个。
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.
中所建议的那样ARel 非常适合在高抽象层次上构建查询。对于我遇到的大多数情况,使用 SQL 片段比使用 ARel 简单得多。选择最适合您的用例的那个。