В рельсах у меня иногда может быть IP-адрес 10.0.0.1
или 10.0.0.1/24
(только примеры), и я хотел бы найти в базе данных IP-адреса, которые либо соответствуют одному IP-адресу, либо попадают в диапазон CIDR.
Вот как я нахожу первый и последний IP:
ip_range = "10.0.0.0/24"
range = IPAddr.new(ip_range).to_range.to_a
start_ip = range[1].to_s # 10.0.0.1
last_ip = range[-2].to_s # 10.0.0.254
condition_statement = "(ip >= '#{start_ip}' AND ip <= '#{last_ip}')"
condition += initial ? condition_statement : " OR #{condition_statement}"
Проблема в том, что если начальный IP-адрес 10.0.0.1
, а последний IP-адрес 10.0.0.254
, то условие никогда не найдет 10.0.0.29
, поскольку оно не попадает между диапазонами в соответствии с условием.
Как можно изменить это условие, чтобы 0-254
фактически включало каждое число между 1-254, включая 29, 30 и т. д. c?
Одна вещь, о которой я подумал, это преобразование start_ip
и last_ip
в целые числа, а затем поиск по столбцу ip
в модель для IP-адресов (удаление "." и преобразование в целые числа), но я тоже не совсем уверен, как это сделать.