我想获取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])
这是一种破解,但它应该有效!