[英]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.