Узнайте, какие идентификаторы еще не существуют из массива идентификаторов - PullRequest
0 голосов
/ 03 июля 2019

У меня есть массив идентификаторов, и я хотел бы узнать, какие из этих идентификаторов еще не существуют.

Возьми это:

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

existing_items = Track.where(spotify_id: spotify_ids)

В этом примере идентификатор 0cj44N6Ux4i2NkTkQIcLnE не существует, поэтому в конечном итоге я пытаюсь получить только ['0cj44N6Ux4i2NkTkQIcLnE'].

Это where просто возвращает найденные записи, и я пытаюсь точно определить, какой из этих идентификаторов не сохранен.

Я пытался Track.where.not(spotify_id: spotify_ids), но он просто возвращал каждую запись из всей таблицы, которая не соответствовала этим идентификаторам, а это не то, что мне нужно.

Самое большее, что массив будет содержать 50 элементов, поэтому, вообще говоря, проблемы с производительностью не должны возникать.

1 Ответ

5 голосов
/ 03 июля 2019

Поскольку списки такие короткие ...

Сначала получите существующие идентификаторы. Используйте pluck, чтобы получить только массив идентификаторов. Это позволяет избежать затрат на выборку всех данных и загрузку их в объекты.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...