Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何筛选数据库中不存在的模型列的值?_Sql_Ruby On Rails_Ruby_Performance_Activerecord - Fatal编程技术网

Sql 如何筛选数据库中不存在的模型列的值?

Sql 如何筛选数据库中不存在的模型列的值?,sql,ruby-on-rails,ruby,performance,activerecord,Sql,Ruby On Rails,Ruby,Performance,Activerecord,给定一个模型ID数组: ids = [1, 2, 3] 如何获取数据库中不存在的ID数组?我可以做到: ids.reject { |id| Model.exists?(id: id) } 但是我不想对每个id进行单独的数据库查询。在单个数据库查询中获取不存在的id的方法是什么?如果您使用的是rails 4或更高版本,您可以使用下面给出的方法 ids = [1, 2, 3] existing_ids = Model.where(id: ids).ids ids - existing_ids

给定一个模型ID数组:

ids = [1, 2, 3]
如何获取数据库中不存在的ID数组?我可以做到:

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

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

如果您使用的是rails 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
分别阅读有关Pull和ids的更多信息

感谢您向我介绍ids方法。

TL;DR:如果ids是要检查的id数组,MyModel是模型的名称,则以下是不存在的id数组:ids-MyModel.whereid:ids.Pulk:id

MyModel.whereid:ids将返回MyModel的所有记录,这些记录的id与ids数组的一个值匹配。但是如果您添加.pluck:id,它将只返回这些记录的id数组。因此,MyModel.whereid:ids.pulk:id是与ids数组值匹配的记录id数组

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


因此,将所有内容放在一起,就可以得到id-MyModel.whereid:ids.pluck:id.

不确定RoR语法,但SQL方法是;创建包含[1,2,3]的数据集,然后确定目标表中不存在的数据集。。。选择样本。*从选择1作为id UNION ALL选择2作为id UNION ALL选择3作为id sample LEFT JOIN target.id=sample.id,其中target.id为NULL@MatBailie+1提供纯SQL解决方案感谢您的回答。有两件事:你不需要Pulk的全部,你可以使用MyModel。Pulk:id直接输入,Sebin的答案效率更高,因为它可能会实例化一个较小的数组,但没有对其进行基准标记。@AlexPopov看起来你没有看到我的编辑,但我已经编辑了我的答案,使其更有效,就像你说的那样;你可以使用.ids代替.pluck:idThank You@Stefan。这对我来说是新鲜事。我正在更新答案。