给出一组模型ID:
ids = [1, 2, 3]
如何获取数据库中尚不存在的id数组?我能做到:
ids.reject { |id| Model.exists?(id: id) }
但我不想为每个id进行单独的数据库查询。在单个数据库查询中获取不存在的ID的方法是什么?
答案 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
感谢您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)
。