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

时间:2015-10-17 02:57:39

标签: ruby-on-rails activerecord has-many-through

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。

1 个答案:

答案 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简单得多。选择最适合您用例的那个。

相关问题