我一直试图找出如何进行查询,以获取表中包含有效ipv6地址的“ip”字段中的所有条目。这是由于可能存在混合的ipv4地址条目。我一直在尝试使用ipaddr库。在控制器中,我可以使用IPAddress.valid_ipv6? "1.2.3.4"来检查给定的字符串是否是ipv6地址。但是,我不知道如何在.where( )查询中使用相同的代码。
通过使用带有“ip”字段的模型,我尝试了以下几种方法:
valid_ip_entries = Table.where("IPAddress.valid_ipv6? ip")valid_ip_entries = Table.where("IPAddress.valid_ipv6? :ip")valid_ip_entries = Table.where("IPAddress.valid_ipv6 ip")但到目前为止我还没有运气。
发布于 2022-07-27 18:07:02
您提供给where的字符串参数只是作为SQL发送到DB。如果希望在DB的每个字段上运行ruby方法,则需要返回所有记录,然后使用ruby迭代器检查每个结果,如下所示:
Table.all.select {|r| IPAddress.valid_ip6? r.ip}注意:我不知道ipaddress,所以我只是承认您知道如何使用它。您还可以使用内置于ruby:IPAddr.new(r.ip).ipv6?中的IPAddr.new(r.ip).ipv6?库。
更新
我刚刚注意到,MySQL似乎有一个专门用于检查字符串值是否为IPv6地址:IS_IPV6()的函数,所以我相信您可以这样做:
Table.where( "IS_IPV6(ip) = 1")发布于 2022-07-27 18:08:36
查询Table.where()需要一个可以转换为SQL片段的参数。不幸的是,您不能在SQL片段中使用IPAddress (Ruby)方法。
解决方案并不如您所希望的那样优雅,您可以使用以下内容:
# matches 7 groups of (4 hex digits followed by ":") and then one last group of 4 hex digits
Table.where("ip_addr regexp
'^([[:xdigit:]]{1,4}:){7}[[:xdigit:]]{1,4}$'")请注意,所显示的regexp只是IPV6地址匹配的粗略近似。有一些不匹配的合法地址。我在这里展示它只是为了说明查询语法。
https://stackoverflow.com/questions/73139192
复制相似问题