我想执行一个ActiveRecord查询,该查询返回除具有某些ID的记录之外的所有记录。我想要排除的ID存储在一个数组中。所以:
ids_to_exclude = [1,2,3]
array_without_excluded_ids = Item. ???
我不知道如何完成第二行。
背景:我已尝试过的内容:
我不确定背景是否必要,但我已经尝试过.find和.where的各种组合。例如:
array_without_excluded_ids = Item.find(:all, :conditions => { "id not IN (?)", ids_to_exclude })
array_without_excluded_ids = Item.where( "items.id not IN ?", ids_to_exclude)
这些失败了。 This tip可能在正确的轨道上,但我没有成功地适应它。任何帮助将不胜感激。
答案 0 :(得分:32)
这应该有效:
ids_to_exclude = [1,2,3]
items_table = Arel::Table.new(:items)
array_without_excluded_ids = Item.where(items_table[:id].not_in ids_to_exclude)
它完全面向对象,没有字符串: - )
答案 1 :(得分:32)
Rails 4解决方案:
ids_to_exclude = [1,2,3]
array_without_excluded_ids = Item.where.not(id: ids_to_exclude)
答案 2 :(得分:2)
您还可以使用Squeel
gem来完成此类查询。
有关它的文档,请here
答案 3 :(得分:0)
正如nslocum所写,以下方法效果很好:
Item.where.not(id: ids_to_exclude)
如果您的“要排除的ID”来自查询(此处带有示例条件),您甚至可以更进一步:
Item.where.not(id: Item.where(condition: true))
如果您需要过滤其他模型,这将非常有用:
OtherModel.where.not(item_id: Item.where(condition: true))