搜索功能 - 错误位置的逻辑

时间:2015-09-08 08:51:38

标签: ruby-on-rails ruby

我正在为其他人设置的应用实施基本搜索功能。有3个表BookingRoomHost,搜索功能需要向用户询问3个字段:start_dateend_date和{{1} }。

搜索需要返回一个主机列表,其中包含该时段可用的房间(start_date / end_date参数)以及同一房间内的客人数量,显示该主机在该时间段内可用的房间以及是否有这些房间已经预订了客人。

搜索还需要根据他们现有的预订(列在number_of_guests表中)确定哪些主机可用,并且需要显示所有可用房间的主机,即使房间已部分预订。

我目前的解决方案是这样的。在Bookings

app/views/search/new.html.erb

<div class="row search-area"> <%= form_tag search_index_path, method: :get do %> <div class="small-12 medium-1 large-1 columns search-field"> <%= label_tag "From", nil, class: "right inline" %> </div> <div class="small-12 medium-2 large-2 columns search-field"> <%= text_field_tag(:start_date, params[:start_date]) %> </div> <div class="small-12 medium-1 large-1 columns search-field"> <%= label_tag "To", nil, class: "right inline" %> </div> <div class="small-12 medium-2 large-2 columns search-field"> <%= text_field_tag(:end_date, params[:end_date]) %> </div> <div class="small-12 medium-1 large-1 columns search-field"> <%= label_tag "Guests", nil, class: "right inline" %> </div> <div class="small-12 medium-2 large-2 columns search-field"> <%= number_field(:number_of_guests, params[:number_of_guests], in: 1.0..20.0, step: 1.0) %> </div> <div class="small-12 medium-3 large-3 columns"> <%= submit_tag "Search", name: nil, :class => "button" %> </div> <% end %> </div>

search_controller.rb

def index @start_date = Date.parse(params[:start_date]) @end_date = Date.parse(params[:end_date]) @guests = (params[:number_of_guests]).first.to_i @space = 0 @bookings = Booking.all @hosts = [] # this will store available hosts # get all hosts for specified time period @bookings.each { |b| @hosts.push(b.room.host) if ((b.start_date >= @start_date && b.start_date <= @end_date) || (b.end_date >= @start_date && b.end_date <= @end_date)) } @hosts = @hosts.paginate(page: params[:page], per_page: 5) end

app/views/search/index.html.erb

我意识到这个解决方案存在很多问题,所以我问是否有人可以指出我正确的方向,我需要采取的步骤,以使此代码遵循最佳实践和更高性能/高效。具体做法是:

  1. 我知道过滤主机的可用房间的逻辑不应该在视图文件中,但我不确定如何将它移动到控制器或者如果它甚至是正确的位置。我正在打破将此代码放在其他地方的逻辑。
  2. 我没有搜索模型,因为我理解模型与数据库表相关联而搜索功能不是。我想错了吗?
  3. 在视图中有很多重复,我希望当我最终弄清楚逻辑过滤室/主机应该去哪里时会清除它,但是如果它没有任何关于干掉视图文件的提示?
  4. 我知道当我计算每个房间的空间时 - 我只检查那个房间的第一个预订。目前,每个房间只有1个预订,但我知道它不会保持这种状态,而且实际上我应该检查该时间段房间的所有预订。我没有这样做,因为在我根据start / end_date参数检索可用主机后,如何进一步过滤主机,这与我的困惑有关。
  5. 任何有助于确定使更多rails / ruby​​-ist和更高性能的步骤的帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

将搜索逻辑放在控制器中并不是一个好主意,因为您可能希望将来在另一个控制器(例如API)中重用该逻辑,因此我建议您创建一个services文件夹在您的应用程序目录app/services中,您将拥有SearchService类,其中search类具有查询和过滤参数并返回结果。

对于视图,我建议您将所有逻辑移动到它的相应模型,例如在Host模型中添加一个功能,检查是否已预订所有房间{{1}并在host.are_all_rooms_booked?模型中添加Room函数,依此类推。

通过这种方式,您可以获得更简单的视图,并且所有逻辑都将位于模型或服务中,因此可以从应用程序的其他部分重复使用。