我想获取其ID不在数组中的所有活动关系。像这样:
@widgets = Widget.where("id not in (?)", [1, 2, 3])
这很好用。它返回完整的Widget表,除了过滤器数组排除的那些记录。但是,如果过滤器数组为空,则它不起作用。
@widgets = Widget.where("id not in (?)", [])
返回“[]”,当我真的想要相当于Widget.all
时我通过首先测试过滤器数组是否为空并修改查询来解决这个问题。但解决方法似乎是kludge
。有没有办法表达这个'where'子句,以便在过滤器数组为空时返回整个表?
答案 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])
这是一种黑客行为,但它应该有效!