Rails:如何使用包含条件?

时间:2015-01-29 22:58:18

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord

我有一个可以预订的资源房间。同样,资源预订属于一个房间。

我的预订模型有一个starts_at和一个ends_at属性。

在我对房间控制器的索引操作中,我希望获得所有房间并包含特定日期的所有预订(日期作为参数提供)。

我已经尝试过这段代码,但它似乎没有按预期工作。

@rooms = Room.includes(:reservations).where("reservations.starts_at" => params[:date])

我知道这段代码没有考虑到房间可以保留多天,但我必须从某个地方开始。

SUM UP

根据日期,操作应返回所有房间,但仅包括与该日期相关的预订。

修改

这就是我最终要做的事情。

控制器/ rooms_controller.rb

def index
  @rooms = Room.includes(:reservations)
  @date = params[:date] ||= Date.today
end

视图/房间/ index.html.haml

- @rooms.each do |room|
  - room.reservations.relevant(@date).each do |reservation|
    = reservation.id

模型/ reservation.rb

def self.relevant(date = Date.today)
  if date.blank?
    date = Date.today
  end
  where(
    '(starts_at BETWEEN ? AND ?) OR (ends_at BETWEEN ? AND ?)',
    date.to_date.beginning_of_day, date.to_date.end_of_day, 
    date.to_date.beginning_of_day, date.to_date.end_of_day
  )
end

它运作正常,但视图是与我认为的模型对话?

1 个答案:

答案 0 :(得分:1)

如果您的where条件引用了另一个表格,那么您还需要指定references以及includes。例如

@rooms = Room.includes(:reservations).
    where("reservations.starts_at" => params[:date]).
    references(:reservations)

请参阅API文档here