Ruby on Rails,模型方法在哪里

时间:2014-10-15 08:46:27

标签: ruby-on-rails ruby ruby-on-rails-3 relation

我有一个样板房,在某些日子有一定的保留。我有一个方法,如果在某个时期有任何保留,则返回。如何在没有预订的情况下获得所有房间?

这是我现在的代码,但是当我使用

@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)

使用一个预订,但是当我在一个房间添加更多预订时,不再有用了

2 个答案:

答案 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