簡體   English   中英

Rails Activerecord:如何排除具有多個關聯記錄的記錄

[英]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應該小於潛在的endDatebookings.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM