2014-05-22 105 views
0

我的模型中有很大的搜索方法,对应于搜索合适的汽车。 它看起来像这样:Ruby on Rails:组织大搜索方法

def self.search(params) 
    cars = joins(:reservations).where.not("reservations.reception_time <= ? AND reservations.return_time >= ?", 
     params[:return_date], params[:handover_date]) 
    cars = joins(:car_class).where("car_classes.id= ?", params[:car_class]) 
    cars = cars_at_both_locations(params[:handover_location], params[:return_location]) 
    cars = params[:car_body_style] == [""] ? cars : joins(:car_configuration). 
     where("car_configurations.body_style_id = ?", params[:car_body_style]) 
    cars = params[:car_fuel] == [""] ? cars : where(fuel: params[:car_fuel]) 
    cars = params[:car_transmission] == [""] ? cars : where(transmission: params[:car_transmission]) 
    cars = params [:car_seats] == [""] ? cars : car_seats(params[:car_seats]) 
    cars = Car.joins(:prices).where('prices.to_days >= ?', 
     (Date.parse(params[:return_date]) - Date.parse(params[:handover_date])).to_i) 
    end 

这是非常不可读... 有没有人有任何想法,以重构这个方法是更具可读性?

+0

听起来像是一个问题,你应该尝试在这里发帖:http://codereview.stackexchange.com/ – Severin

+0

谢谢。我添加了一个帖子: http://codereview.stackexchange.com/questions/51378/ruby-on-rails-refactor-big-search-method –

回答

1

你应该在你的汽车模型

使用适当的名称范围为每个方法,例如你的第一个两行,加在你的模型

scope :available, ->(handover_date,return_date) { joins(:reservations).where.not("reservations.reception_time <= ? AND reservations.return_time >= ?", 
     return_date, handover_date)} 
scope :with_class, ->(car_class_id) {where("car_classes.id= ?", car_class_id)} 

然后您将只需要编写

def self.search(opts) 
    available(opts[:handover_date],opts[:return_date]). 
    with_class(opts[:car_class_id]). 
[...] 
end 

您还可以使用随处可用的示波器和类,这也非常酷。

+0

我chnaged这个代码使用类方法,因为他们也是很长的范围。感谢帮助。 –