【发布时间】:2021-09-15 08:29:14
【问题描述】:
房间有_many预订
预订belongs_to房间
我有这段代码,它工作正常:
available_rooms = Room.select {|room| room.bookings.where("day = ?", date).count < 3 || room.bookings.empty?}
但我想知道是否可以像带有左连接的 lambda 一样重写它
scope :available, lambda {|date| joins('LEFT OUTER JOIN bookings on bookings.room_id = rooms.id').......
我试过了,但只返回了至少有一个预订的房间,所以完全没有预订的空房间被排除在外:
def self.available(date)
# You can use `Arel.star` instead of `:id` on postgres.
b = Booking.arel_table[:id]
group(:id)
.left_joins(:bookings)
.where(bookings: { day: date })
.having(b.count.lt(3)) # COUNT(bookings.id) < 3
end
【问题讨论】:
-
谢谢!但在这种情况下,我只会收到在该日期有预订的房间。我需要的 - 所有在该日期没有预订的房间 + 在该日期有预订但总预订量
-
你可以在你的查询中添加有和组子句吗?
.having("COUNT(date) < 3").group(:id)
标签: ruby-on-rails ruby lambda