使用ActiveRecord查找没有关联的记录,或者给出关联条件

时间:2014-04-11 19:57:13

标签: sql ruby-on-rails ruby postgresql activerecord

如何找到错过关联或匹配记录关联条件的记录?

我有一个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。

2 个答案:

答案 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').