我有如下所示的关联查询。
当每辆自行车只有一个预订记录时,该查询起作用,但是当自行车有多个预订并且一个或多个满足条件而其他不满足条件时,该查询失败。由于另一辆不符合条件,因此导致相关自行车退回。
如何编写查询,以便当至少一项预订满足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)
答案 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}