我有一个样板房,在某些日子有一定的保留。我有一个方法,如果在某个时期有任何保留,则返回。如何在没有预订的情况下获得所有房间?
这是我现在的代码,但是当我使用
时@rooms = @category.rooms.availible(@date_start, @date_end),
无论什么关系,它都会返回所有房间。当我使用
时room.reservations.where("date_start >= ? || date_end <= ?", startd, endd).count
它返回的金额很好-.-
class Room < ActiveRecord::Base
attr_accessible :cat_id, :room_nr
validates_uniqueness_of :room_nr
has_many :reservations
belongs_to :category, foreign_key: "cat_id"
def self.availible(startd, endd)
where(self.Resvs(startd, endd)==0)
end
def self.Resvs(startd, endd)
return joins(:reservations).where("date_start >= ? || date_end <= ?", startd, endd).count
end
end
我现在将查询移到控制器,以获得我使用的房间
@rooms = @category.rooms.joins('LEFT OUTER JOIN reservations ON reservations.room_id = rooms.id').where("date_start >= ? || date_end <= ?", @date_start, @date_end)
但是无论什么日期(也是房间需要来自他们的父母@category),这将返回所有预订的房间。
接近,更改它选择预订不在这样的
@rooms = @category.rooms.joins('LEFT OUTER JOIN reservations ON reservations.room_id = rooms.id').
where("room_id IS NULL OR date_start > ? OR date_end < ?", @date_end, @date_start)
使用一个预订,但是当我在一个房间添加更多预订时,不再有用了
答案 0 :(得分:0)
在这种情况下,您可以像这样使用NOT EXISTS
:
def self.availible(startd, endd)
@category.rooms.where("NOT EXISTS(select 1 from reservations where reservations.room_id = rooms.id and (date_start > ? OR date_end < ?))", startd, endd)
end
希望这有帮助
答案 1 :(得分:0)
修正了它! 谢谢你的帮助
def self.availible(startd, endd)
where("NOT EXISTS(select 1 from reservations where reservations.room_id = rooms.id and ((date_start>=:date_start AND date_start<=:date_end) OR (date_end>=:date_start AND date_end<=:date_end)))", {date_start: startd, date_end: endd})
end