2016-11-30 35 views
0

我希望只有一个查询,但我的问题是,当一些参数为零,它将不返回结果,而我希望它返回所有。见代码:在params为零时在一个查询中搜索?

deliverer_ids = params[:deliverer_ids]&.map(&:to_i) || [] 
shopper_ids = params[:shopper_ids]&.map(:to_i) || [] 
@orders  = @orders.includes(:deliverer, :shopper).where(deliverer_id: deliverer_ids, shopper_id: shopper_ids) 

将返回什么,我想达到的目标是让Order.all如果PARAMS deliverer_idsshopper_ids是零。

回答

0

问题是,我相信你明白,如果例如deliverer_ids缺失,你需要deliverer_id是...没有ID。即使您在shopper_ids中指定了有效的ID,也不会有任何行匹配。

未经测试,但我想这应该工作,如果你改变deliverer_idsdeliverer_id

conditions = params 
    .slice(:deliverer_id, :shopper_id) 
    .map { |x| x.map(&:to_i) } 
@orders = @orders.includes(:deliverer, :shopper).where(conditions) 

如果不重命名这些,那么你有更多的麻烦的。

这个想法是不通过你没有的条件。 ActiveSupport的slice允许你只保留你想要的参数,然后将它们作为条件直接发送到where

编辑:更简单,不需要重命名:只需使用compact

deliverer_ids = params[:deliverer_ids]&.map(&:to_i) 
shopper_ids = params[:shopper_ids]&.map(:to_i) 
conditions = { 
    deliverer_id: deliverer_ids, 
    shopper_id: shopper_ids 
}.compact 
@orders = @orders.includes(:deliverer, :shopper).where(conditions) 

注意去除有害|| []位。事实上,我没有测试,但它甚至可能与您的原始代码一起工作,只要您放弃这一点 - 如果限制为nil,ActiveRecord可能足够智能以包含任何限制。