当params为零时,在一个查询中搜索?

时间:2016-11-30 07:51:44

标签: sql ruby-on-rails ruby ruby-on-rails-4 psql

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

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.alldeliverer_ids为零,

将不会返回任何内容,而我想要实现的目标是shopper_ids

1 个答案:

答案 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可能足够聪明,不包括任何限制。