[英]Rails Activerecord: How to exclude records with multiple associated records
我有以下所示的关联查询。
当每辆自行车只有一个预订记录时,该查询起作用,但是当自行车有多个预订并且一个或多个满足条件而其他不满足条件时,查询将失败。 由于另一个不符合条件,因此会导致相关自行车退回。
如何编写查询,以便在至少一项预订满足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)
您可以在Bike
上运行查询,在Booking
上使用子查询:
Bike.where.not(
id: Booking.select('DISTINCT bike_id').where(...)
)
我认为您可以稍微简化一下条件。 我没有考虑过极端情况,但是您可以执行以下操作:
Bike.where.not(
id: Booking.where("start_time < ? and end_time > ?", endDate, startDate
).group(:bike_id))
因此,基本上bookings.start_time
应该小于潜在的endDate
而bookings.end_time
大于潜在的startDate
。 因此,您将获得潜在的新预订时间范围内的所有预订, not
添加则将选择相反的
我已经在一个简单的数据集上测试了样本,其中不包括占用的自行车。 请让我知道是否适合您
您可以颠倒一切,从所需的预订开始查询,并找到所有独特自行车的集合:
@bikes = Booking.where.not(...).group(:bike_id).includes(:bikes).map{|b| b.bike}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.