2014-01-14 1 views
1

배열의 개체를 필터링해야합니다."SQL 쿼리와 같은"많은 매개 변수가있는 배열 필터링

(need_bedrooms_min >= :nb_bedrooms_min) AND (budget_amount BETWEEN :budget_min AND :budget_max) AND ((need_surface_min BETWEEN :surface_min AND :surface_max) OR (need_surface_max BETWEEN :surface_min AND :surface_max))"+req,{nb_bedrooms_min: params[:nb_bedrooms_min], budget_min: params[:budget_min], budget_max: params[:budget_max],surface_min: params[:surface_min], surface_max: params[:surface_max]}).paginate(:page => params[:page]) 

나는 해결책을 찾을 해달라고 ... 누군가가 나를 도울 수 :

그것은 하나 개의 매개 변수

@usersc = @usersb.select { |user| user.need_appartment? } 

하지만 난 SQL/액티브에보다 더 많은 매개 변수를 사용하려는 작동? 더 깨끗하게

@usersb.select do |user| 
    user.need_bedrooms_min >= params[:nb_bedrooms_min].to_i && 
    (params[:budget_min].to_i..params[:budget_max].to_i).include? user.budget_amount && 
    ((params[:surface_min].to_i..params[:surface_max].to_i).include? user.need_surface_min || 
    (params[:surface_min].to_i..params[:surface_max].to_i).include? user.need_surface_max) 
end 

을 또는 :

F.

답변

4

select 당신이 할 수 있습니다 당신이 많은 매개 변수를 필요로 정확히 수행

class User 
    def needs_apartment?(params) 
    budget_min, budget_max, surface_min, surface_max, nb_bedrooms_min = 
     %w{budget_min budget_max surface_min surface_max nb_bedrooms_min}.map{|k| params[k.to_sym].to_i} 
    budget_range = budget_min..budget_max 
    surface_range = surface_min..surface_max 

    need_bedrooms_min >= nb_bedrooms_min && 
     budget_range.include? budget_amount && 
     (surface_range.include?(need_surface_min) || surface_range.include?(need_surface_max)) 
    end 
end 

@usersb.select{|user| user.needs_apartment?(params)} 
+0

을하거나 속하지 않는 경우 모델 메서드에서 람다 ('the_ones_i_want = lambda {...}')와'@ usersb.select (& the_ones_i_want)'대신에 그것을 던져라. 또는 컨트롤러 메소드와'@ usersb.select (& method (: the_ones_i_want))'에 로직을 숨긴다. –

관련 문제