当参数为零时在一个查询中搜索?

Search in one query when params are nil?

我希望只有一个查询,但我的问题是当某些参数为零时,它将 return 没有结果,而我希望它 return 全部。见代码:

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)

将 return 什么都没有,我想要实现的是在参数 deliverer_idsshopper_ids 为零时获得 Order.all

问题是,我相信你明白,如果例如。 deliverer_ids 丢失,您要求 deliverer_id 是其中之一...没有 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)

注意删除了损坏的 || [] 位。事实上,我没有测试,但它甚至可以与你的原始代码一起工作,只要你放弃那个位 - ActiveRecord 可能足够聪明,如果限制是 nil.[=22 则不包含任何限制=]