引用密钥为 ip_address 的哈希

Refer to a hash where the key is an ip_address

我有一个模型需要按 :sending_ip 分组,它是数据库中的 "cidr" 列。

@count_hash = Webhook.group('sending_ip').count

产生这个散列:

{#<IPAddr: IPv4:213.32.165.239/255.255.255.255>=>127000, #<IPAddr: IPv4:153.92.251.118/255.255.255.255>=>228000}

我不知道如何引用这种类型的密钥。以下是我尝试调用这些键的方式的一些示例。全部 return 无或错误。

@count_hash[#<IPAddr: IPv4:213.32.165.239/255.255.255.255>]

@count_hash["#<IPAddr: IPv4:213.32.165.239/255.255.255.255>"]

@count_hash[<IPAddr: IPv4:213.32.165.239/255.255.255.255>]

@count_hash["#<IPAddr: IPv4:213.32.165.239/255.255.255.255>"]

在我的应用程序的其他地方,我有一个效果很好的简单示例。其他示例按 esp 分组,结果为此散列:

{"hotmail"=>1000, "gmail"=>354000}

第二个哈希,我可以轻松参考

@count_hash["gmail"]

得到预期结果354000

如何使用按 sending_ip 分组的先前哈希实现相同的功能?预先感谢您的见解。

这个:

#<IPAddr: IPv4:213.32.165.239/255.255.255.255>

是在 IPAddr 的实例上调用 #inspect 的结果。所以键是 IPAddr 个实例,你可以说:

ip = IPAddr.new('213.32.165.239')
@count_hash[ip]
# 127000

或者您可以迭代散列:

@count_hash.each { |ip, n| ... }

或通过其键:

@count_hash.keys.each { |ip| ... }

取决于您需要做什么。如果更方便的话,您甚至可以将键转换为字符串:

@count_hash = @count_hash.transform_keys(&:to_s)
# or
@count_hash.transform_keys!(&:to_s)