过滤具有许多参数的数组“就像SQL查询”

时间:2014-01-14 19:26:40

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我需要过滤数组中的对象。

它适用于一个参数

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

但我想使用比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])

我找不到解决方案......任何人都可以帮助我吗?

F。

1 个答案:

答案 0 :(得分:4)

select可以根据您的需要为您提供所需的参数:

@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

或者,更干净:

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)}