1

I need to filter objects in array.

It works with one parameters

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

but i would like use more parameters than in SQL/ActiveRecord :

(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])

I dont find the solution... Anyone can help me ?

F.

1 Answer 1

4

select does exactly what you need with as many parameters as you might want:

@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

Or, more cleanly:

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)}
Sign up to request clarification or add additional context in comments.

1 Comment

Or if it doesn't belong in a model method, toss it in a lambda (the_ones_i_want = lambda { ... }) and @usersb.select(&the_ones_i_want) instead. Or stash the logic in a controller method and @usersb.select(&method(:the_ones_i_want)) if that makes more sense.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.