我正在为其他人设置的应用实施基本搜索功能。有3个表Booking
,Room
和Host
,搜索功能需要向用户询问3个字段:start_date
,end_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
我意识到这个解决方案存在很多问题,所以我问是否有人可以指出我正确的方向,我需要采取的步骤,以使此代码遵循最佳实践和更高性能/高效。具体做法是:
任何有助于确定使更多rails / ruby-ist和更高性能的步骤的帮助将非常感激。
答案 0 :(得分:0)
将搜索逻辑放在控制器中并不是一个好主意,因为您可能希望将来在另一个控制器(例如API)中重用该逻辑,因此我建议您创建一个services
文件夹在您的应用程序目录app/services
中,您将拥有SearchService
类,其中search
类具有查询和过滤参数并返回结果。
对于视图,我建议您将所有逻辑移动到它的相应模型,例如在Host
模型中添加一个功能,检查是否已预订所有房间{{1}并在host.are_all_rooms_booked?
模型中添加Room
函数,依此类推。
通过这种方式,您可以获得更简单的视图,并且所有逻辑都将位于模型或服务中,因此可以从应用程序的其他部分重复使用。