0

我的模型

class House < ActiveRecord::Base
    has_many: bookings
end

class Booking < ActiveRecord::Base
    belongs_to: house
end

预订表具有字段 customer_name、start_time、end_time 等。

我想在房屋页面索引页面上制作一个搜索表单(start_time,end_time),以便访问者可以检查给定时间段内哪些房屋可用。

有人知道如何开始吗?

4

2 回答 2

1

在视图中,声明一个不链接到任何对象的表单

<% form_tag :url => search_book_path, :method => :get do %>
  <%= text_field_tag :start_time %>
  <%= text_field_tag :end_time %>
  <%= submit_tag %>
<% end %>

在书籍上添加路线

map.resource :books, :collection => { search => :get }

在 book_controller 中,声明函数 search:

def search
  start_time = params[:start_time] || DateTime.now
  end_time = params[:end_time] || DateTime.now
  @books = Book.search(start_time, end_time)
end

然后在 Book 模型上声明搜索

def search(start_time_, end_time_)
  return Book.find(:all, :conditions => [
       "#{Book.table_name}.start_time >= ? AND #{book.table_name}.end_time <= ?",
       start_time_,
       end_time_]
  )
end

不确定所有的语法,但这应该给你一个想法。

编辑:我不明白所有的问题。模型功能search应该搜索可用的房屋:

  • 未在要求的开始日期使用:book.end_time < start_time_
  • 未在规定的结束日期预订:book.start_time > end_time_

像这样

def search_for_availability_between(start_time_, end_time_)
  return Book.find(:all, :conditions => [
       "#{Book.table_name}.start_time > ? AND #{book.table_name}.end_time < ?",
       end_time_,
       start_time_]
  )
end

你应该通过测试来检查它,但我认为它应该可以工作。

于 2013-04-18T11:08:39.203 回答
0

在控制器中

@books = Book.available_house(start_time, end_time)

在 Book 模型中,您可以使用范围

室内模型

def available_house(start, finish)
  where("id not in (select t.house_id from timings t where (t.start_time between ? and ?) || (t.end_time between ? and ?) )", start,finish,start,finish)
end
于 2013-04-18T12:30:06.170 回答