我的模型中有一个很大的搜索方法,对应于搜索适当的Car。 它看起来像这样:
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 :(得分:1)
您应该为Car模型中的每个方法使用具有专有名称的范围
例如,对于前两行,请添加模型
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
你也可以在任何地方使用可用的范围和课程,这也很酷。