如何过滤数据库中不存在的模型列的值?

时间:2016-06-01 09:08:34

标签: sql ruby-on-rails ruby performance activerecord

给出一组模型ID:

ids = [1, 2, 3]

如何获取数据库中尚不存在的id数组?我能做到:

ids.reject { |id| Model.exists?(id: id) }

但我不想为每个id进行单独的数据库查询。在单个数据库查询中获取不存在的ID的方法是什么?

2 个答案:

答案 0 :(得分:6)

如果您使用的是轨道4或以上

,您可以使用下面给出的内容
ids = [1, 2, 3]
existing_ids = Model.where(id: ids).ids
ids - existing_ids

如果您使用的是rails 3,则需要

ids = [1, 2, 3]
existing_ids = Model.where(id: ids).pluck(:id)
ids - existing_ids

分别详细了解pluckids herehere

感谢您Stefan向我指出了ids方法。

答案 1 :(得分:3)

TL; DR:如果ids是要检查的ID数组,MyModel是模型的名称,则以下是不存在的ID数组:ids - MyModel.where(id: ids).pluck(:id) < / p>

MyModel.where(id: ids)将返回MyModel的所有记录,其ID与您的ids数组之一相匹配。但是,如果添加.pluck(:id)将返回仅包含这些记录的ID的数组。因此,MyModel.where(id: ids).pluck(:id)是与ids数组值匹配的记录ID数组。

然后你可以使用减号运算符来区分两个数组。 array1 - array2仅返回array2中不在array2中的元素。

所以把所有内容放在一起就得到ids - MyModel.where(id: ids).pluck(:id)