如何找到错过关联或匹配记录关联条件的记录?
我有一个Reservation
模型,该模型可以有或没有与之关联的Booking
(has_one)记录。我想找到没有关联的所有记录,如果我确实有Booking
关联,booking_agent
不属于Venue::Promoter
的那些记录。
这是我目前的范围:
scope :not_requested_by_promoters, -> {
joins("LEFT JOIN
\"bookings\" ON \"reservations\".\"id\" = \"bookings\".\"reservation_id\"
AND \"bookings\".\"booking_agent_type\" != 'Venue::Promoter'")
}
另一位开发人员编写了以下范围,但如果没有与之关联的预订则与这些记录不匹配:
scope :not_requested_by_promoters, -> {
joins(:booking).where('booking_agent_type != ?', "Venue::Promoter")
}
两者都不符合我的要求。我在这里错过了什么?我做了一些研究,左连接应该有效。
数据库是PostgreSQL。
答案 0 :(得分:0)
您需要LEFT JOIN
来显示所有Reservations
,即使是没有Bookings
的人也是如此。进行连接后,您只需要检查具有bookings.reservation_id IS NULL
的记录。这将只带来预期的结果。
scope :not_requested_by_promoters, -> {
joins("LEFT JOIN
bookings ON reservations.id = bookings.reservation_id
AND bookings.reservation_id IS NULL
AND bookings.booking_agent_type != 'Venue::Promoter'")
}
答案 1 :(得分:0)
感谢Dolph在Learn Thoughtbot聊天室:
joins('LEFT JOIN bookings ON bookings.reservation_id = reservations.id').
where("(bookings.reservation_id IS NULL)
OR (bookings.booking_agent_type != ?)", 'Venue::Promoter').