从一组ID中找出尚不存在的ID

时间:2019-07-03 20:32:05

标签: ruby-on-rails postgresql

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

为此:

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

existing_items = Track.where(spotify_id: spotify_ids)

在此示例中,ID 0cj44N6Ux4i2NkTkQIcLnE不存在,所以我最终试图返回的只是['0cj44N6Ux4i2NkTkQIcLnE']

where仅返回它找到的记录,而我试图指出它没有保存了哪些ID。

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

该数组最多只能包含50个项目,因此,一般而言,性能问题不会出现。

1 个答案:

答案 0 :(得分:5)

由于列表太短了...

首先,获取现有的ID。使用pluck仅获取ID数组。这样避免了获取所有数据并将其加载到对象中的开销。

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

然后简单地subtract从另一个数组中分离一个。

missing_spotify_ids = spotify_ids - existing_spotify_ids

如果可能有重复项,则可能需要在查询上使用distinct和/或在missing_spotify_ids上使用uniq