当参数为零时在一个查询中搜索?
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_ids
和 shopper_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 则不包含任何限制=]
我希望只有一个查询,但我的问题是当某些参数为零时,它将 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_ids
和 shopper_ids
为零时获得 Order.all
。
问题是,我相信你明白,如果例如。 deliverer_ids
丢失,您要求 deliverer_id
是其中之一...没有 ID。即使您在 shopper_ids
.
未经测试,但我认为这应该有效,如果您将 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 则不包含任何限制=]