2

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

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

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

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

返回“[]”,当我真的想要 Widget.all 的等价物时

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

4

2 回答 2

2

您可以向 Widget 模型添加范围:

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

然后只需在需要的地方执行此操作即可:

@widgets = Widgets.excluding_ids([1,2,3])
于 2013-07-11T15:35:09.127 回答
1

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

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

这是一种 hack,但它应该可以工作!

于 2013-07-11T15:23:04.677 回答