Rails Activerecord:如何排除具有多个关联记录的记录

时间:2018-09-13 14:52:32

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

我有如下所示的关联查询。

当每辆自行车只有一个预订记录时,该查询起作用,但是当自行车有多个预订并且一个或多个满足条件而其他不满足条件时,该查询失败。由于另一辆不符合条件,因此导致相关自行车退回。

如何编写查询,以便当至少一项预订满足where.not条件时不将自行车作为查询结果返回?

class Bike < ActiveRecord::Base
  has_many :bookings
end 

class Booking < ActiveRecord::Base
  belongs_to :bike
end 

startDate = Date.parse("2018-10-10")
endDate = Date.parse("2018-10-19")

@bikes = Bike.joins(:bookings).where.not("(date_start BETWEEN (?) AND (?)) OR (date_start BETWEEN (?) AND (?)) OR (((?) OR (?)) BETWEEN date_start AND date_end)", startDate, endDate, startDate, endDate, startDate, endDate)

2 个答案:

答案 0 :(得分:2)

您可以在Bike上运行查询,并在Booking上运行子查询:

Bike.where.not(
  id: Booking.select('DISTINCT bike_id').where(...)
)

答案 1 :(得分:0)

您可以颠倒一切,从所需的预订开始查询,并找到所有其独特的自行车的集合:

@bikes = Booking.where.not(...).group(:bike_id).includes(:bikes).map{|b| b.bike}