如果筛选器数组为空,则活动记录'where'子句不起作用



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

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

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

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

return"[]",当我真的想要Widget.all 的等价物时

我已经解决了这个问题,首先测试过滤器数组是否为空,然后修改查询。但解决方法似乎是kludge。有没有一种方法可以表达这个"where"子句,以便在筛选器数组为空时返回整个表?

您可以向Widget模型添加一个作用域:

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

然后,只要在任何你需要的地方做这件事:

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

我假设您的id从1开始,所以您不会有id为0的Widget。您可以向数组中添加一个零,这样它就永远不会为空,并且它将返回所有小部件,因为没有一个小部件的id=0。

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

这是一种破解,但它应该有效!

最新更新