如果过滤器数组为空,则ActiveRecord'where'子句不起作用

时间:2013-07-11 15:18:07

标签: ruby-on-rails

我想获取其ID不在数组中的所有活动关系。像这样:

    @widgets = Widget.where("id not in (?)", [1, 2, 3])

这很好用。它返回完整的Widget表,除了过滤器数组排除的那些记录。但是,如果过滤器数组为空,则它不起作用。

    @widgets = Widget.where("id not in (?)", [])

返回“[]”,当我真的想要相当于Widget.all

我通过首先测试过滤器数组是否为空并修改查询来解决这个问题。但解决方法似乎是kludge。有没有办法表达这个'where'子句,以便在过滤器数组为空时返回整个表?

2 个答案:

答案 0 :(得分:2)

您可以将范围添加到窗口小部件模型:

scope :excluding_ids, ->(ids) { where('id NOT IN (?)', ids) if ids.any? }

然后只需要在任何需要的地方执行此操作:

@widgets = Widgets.excluding_ids([1,2,3])

答案 1 :(得分:1)

我假设您的ID从1开始,因此您将不会拥有ID = 0的Widget。 你可以给数组添加一个零,所以它永远不会是空的,它会返回所有的小部件,因为没有id = 0。

@widgets = Widget.where("id not in (?)", my_array + [0])

这是一种黑客行为,但它应该有效!