首页 > 解决方案 > 从 ID 数组中找出哪些 ID 尚不存在

问题描述

我有一组 ID,我想查询其中哪些 ID 尚不存在。

拿着这个:

spotify_ids = ['47k5tMDS3jLAOFE29nkfzO', '5mv8xuH3y6jxFCBT6a3w4K', '5En0gXQk01BaWoT4q2oVbe', '0cj44N6Ux4i2NkTkQIcLnE']

existing_items = Track.where(spotify_id: spotify_ids)

在这个例子中,ID0cj44N6Ux4i2NkTkQIcLnE不存在,所以我最终想要返回的只是['0cj44N6Ux4i2NkTkQIcLnE'].

where只是返回它找到的记录,我试图找出它没有保存的那些 ID。

我试过Track.where.not(spotify_id: spotify_ids)了,但这只是从整个表中返回了与这些 ID 不匹配的每条记录,这不是我想要的。

数组中最多有 50 个项目,所以一般来说,不应该出现性能问题。

标签: ruby-on-railspostgresql

解决方案


因为名单太短了...

首先,获取现有的 ID。用于pluck仅获取一组 ID。这避免了获取所有数据并将其加载到对象中的成本。

existing_spotify_ids = Track.where(spotify_id: spotify_ids).pluck(:spotify_id)

然后简单地从另一个数组中减去一个数组。

missing_spotify_ids = spotify_ids - existing_spotify_ids

如果可能有重复项,您可能需要distinct在查询和/或uniq.missing_spotify_ids


推荐阅读