首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得所有字段与Rails中的IPv6格式匹配的条目?

如何获得所有字段与Rails中的IPv6格式匹配的条目?
EN

Stack Overflow用户
提问于 2022-07-27 13:51:32
回答 2查看 60关注 0票数 0

我一直试图找出如何进行查询,以获取表中包含有效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")

但到目前为止我还没有运气。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-27 18:07:02

您提供给where的字符串参数只是作为SQL发送到DB。如果希望在DB的每个字段上运行ruby方法,则需要返回所有记录,然后使用ruby迭代器检查每个结果,如下所示:

代码语言:javascript
复制
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()的函数,所以我相信您可以这样做:

代码语言:javascript
复制
Table.where( "IS_IPV6(ip) = 1")
票数 1
EN

Stack Overflow用户

发布于 2022-07-27 18:08:36

查询Table.where()需要一个可以转换为SQL片段的参数。不幸的是,您不能在SQL片段中使用IPAddress (Ruby)方法。

解决方案并不如您所希望的那样优雅,您可以使用以下内容:

代码语言:javascript
复制
# 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地址匹配的粗略近似。有一些不匹配的合法地址。我在这里展示它只是为了说明查询语法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73139192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档