如何从Rails中的查询中排除一组id(使用ActiveRecord)?

时间:2011-01-03 00:49:14

标签: activerecord ruby-on-rails-3 arel active-relation

我想执行一个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可能在正确的轨道上,但我没有成功地适应它。任何帮助将不胜感激。

4 个答案:

答案 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))