我有一系列哈希,其中还包括一个数组:
machines = [{ 'name' => 'ldapserver1', 'ip' => '10.199.0.10',
'role' => ['server', 'initial'] },
{ 'name' => 'ldapserver2', 'ip' => '10.199.0.11',
'role' => ['server', 'secondary'] },
{ 'name' => 'ldapclient1', 'ip' => '10.199.0.12',
'role' => 'client' },
{ 'name' => 'ldapclient2', 'ip' => '10.199.0.13',
'role' => 'client' }]
我想通过它搜索以匹配角色来获取机器。
我可以用它来获取具有客户角色的机器:
results = @machines.select { |machine| machine['role'] == 'client' }
[{"name"=>"ldapclient1", "ip"=>"10.199.0.12", "role"=>"client"}, {"name"=>"ldapclient2", "ip"=>"10.199.0.13", "role"=>"client"}]
但是,当我尝试搜索角色数组时,这会破裂:
results = machines.select { |machine| machine['role'] == 'server' }
[]
如何搜索角色阵列以找到我的机器的匹配项?
这是Enumerable#grep
的完美用例:
machines.reject { |m| [*m['role']].grep('server').empty? }
在这里,SPLAT用于从Array
实例和String
实例中产生数组。
根据您的代码,角色可以是字符串或数组,因此可以安全地检查以下
results = machines.select { |machine| Array(machine['role']).include?('server') }
更新:使用数组,此方法试图通过调用to_ary来创建数组,然后在其参数上to_a。
那是因为 'role'
可以是字符串或数组。
如果是字符串,则使用#include?
匹配一部分。或完全匹配数组中的字符串。
尝试:
results = machines.select { |machine| machine['role'].include?('server') }
或更强大的
results = machines.select do |machine|
r = machine['role']
if r.is_a? String
r == 'server'
else
r.include?('server')
end
end