我希望只有一个查询,但我的问题是,当某些参数为零时,它将不返回任何结果,而我希望它返回所有。见代码:
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)
如果params Order.all
和deliverer_ids
为零,将不会返回任何内容,而我想要实现的目标是shopper_ids
。
答案 0 :(得分:0)
问题是,正如我相信你理解的那样,如果是缺少deliverer_ids
,您要求deliverer_id
是......之一。即使您在shopper_ids
中指定了有效的ID,也不会有任何行匹配。
未经测试但我认为这应该有用,如果您将deliverer_ids
更改为deliverer_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可能足够聪明,不包括任何限制。