【问题标题】:Ruby on Rails, model method in whereRuby on Rails,模型方法在哪里
【发布时间】:2014-10-15 08:46:26
【问题描述】:

我有一个样板间,在某些日子有某些预订。我有一个方法,如果在一段时间内有任何预订,就会返回。我如何才能获得该期间内没有预订的所有房间?

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

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

适用于一个预订,但是当我在一个房间上添加更多预订时不再起作用

【问题讨论】:

  • 你能举一些例子,比如这个查询返回什么,你期望它返回什么?

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


【解决方案1】:

在这种情况下,您可以像这样使用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 

希望对你有帮助

【讨论】:

    【解决方案2】:

    修好了! 谢谢帮忙

    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 
    

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2016-11-04
      • 1970-01-01
      • 2011-05-05
      • 2020-05-15
      相关资源
      最近更新 更多