Я бы сначала сопоставил обе коллекции с их идентификаторами:
server_user_ids = @server.map { |user| user[:id] }
client_user_ids = @client.map { |user| user[:id] }
Затем вы можете удалить всех пользователей с помощью:
User.where(id: server_user_ids - client_user_ids).delete_all
Обратите внимание, что оба delete
и delete_all
будут не запускать обратные вызовы. Если вы действительно хотите запускать обратные вызовы, используйте вместо этого destroy
или destroy_all
.
Если @server
и @client
могут содержать большие коллекции, я бы предложил вместо этого использовать наборы. У них более быстрое время поиска, но немного ухудшается читаемость.
server_user_ids = @server.map { |user| user[:id] }.to_set
client_user_ids = @client.map { |user| user[:id] }.to_set
User.where(id: server_user_ids - client_user_ids).delete_all
Я не уверен, работает ли where
с наборами. Если нет, измените указанное выше на [*server_user_ids - client_user_ids]
, которое распределяет результирующий набор в массив. Вы также можете позвонить по номеру to_a
в получившемся наборе. (server_user_ids - client_user_ids).to_a