Запрос для записей с IP-адресом, НЕ включенным в столбец CIDR - PullRequest
0 голосов
/ 17 января 2019

У меня есть две существующие таблицы: Устройства имеет столбец inet: ipaddress В сети есть столбец inet: cidr

Мне нужна область в таблице Devices, которая возвращает только те устройства, IPaddress которых НЕ содержится ни в одной из сетей. Cidr

ПРИМЕЧАНИЕ: postgres имеет оператор INET <<, чтобы проверить, содержит ли CIDR IP-адрес. Но это обрабатывает только один CIDR, в то время как у меня есть целая таблица из них. </p>

Мне нужно что-то вроде этого:

    class Device
      scope :not_in_any_network, -> where("devices.ipaddress NOT IN (?)", Network.select(:cidr))

Цель состоит в том, чтобы иметь возможность связать прицел с другими, такими как:

    problems = Device.active.not_in_any_network.other_scopes

1 Ответ

0 голосов
/ 17 января 2019

Я смог получить желаемые результаты, используя следующий код:

    Device.where('devices.ipaddress <<= ANY(ARRAY[?]::inet[])', Network.pluck('TEXT(cidr)'))

Преобразование Network.cidr в TEXT было необходимо, чтобы избежать ошибки «Ошибка типа: невозможно указать IPAddr».

Затем я должен был привести массив к inet [], чтобы работал оператор <<. </p>

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