3件事:
- Logistic has_many
RentalRequests through
Type_Logistic关联表。
- Logistic不必存在RentalRequest(即,不存在Type_Logistic关联)
- RentalRequest有一个status_id
列
我想找到所有Logistic记录,其中没有关联的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
或一个链中做到这一点。
谢谢!
EDIT!更新了上面的代码,因为原始merge
表示AND而不是OR。
答案 0 :(得分:0)
不要害怕使用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简单得多。选择最适合您用例的那个。